MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型 。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
总结: mongoDB 是一个非关系型文档数据库

历史

  • 2009年2月,MongoDB数据库首次在数据库领域亮相,打破了关系型数据库一统天下的局面;
  • 2010年8月, MongoDB 1.6发布。这个版本最大的一个功能就是Sharding,自动分片
  • 2014年12月, MongoDB3.0发布。由于收购了WiredTiger 存储引擎,大幅提升了MongoDB的写入性能;
  • 2015年12月,3.2版本发布,开始支持了关系型数据库的核心功能:关联。你可以一次同时查询多个MongoDB的集合。
  • 2016年, MongoDB推出Atlas,在AWS、 Azure 和GCP上的MongoDB托管服务;
  • 2017年10月,MongoDB成功在纳斯达克敲钟,成为26年来第一家以数据库产品为主要业务的上市公司。
  • 2018年6月, MongoDB4.0 发布推出ACID事务支持,成为第一个支持强事务的NoSQL数据库;
  • 2018年—至今,MongoDB已经从一个在数据库领域籍籍无名的“小透明”,变成了话题度和热度都很高的“流量”数据库。

    特点

  • 面向集合存储,易存储对象类型的数据

  • 支持查询,以及动态查询
  • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
  • 文件存储格式为BSON(一种JSON的扩展)
  • 支持复制和故障恢复和分片
  • 支持事务支持
  • 索引 聚合 关联….

    应用场景

  • 游戏应用:使用云数据库MongoDB作为游戏服务器的数据库存储用户信息。用户的游戏装备、积分等直接以内嵌文档的形式存储,方便进行查询与更新。

  • 物流应用:使用云数据库MongoDB存储订单信息,订单状态在运送过程中会不断更新,以云数据库MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来,方便快捷且一目了然。
  • 社交应用:使用云数据库MongoDB存储用户信息以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。并且,云数据库MongoDB非常适合用来存储聊天记录,因为它提供了非常丰富的查询,并在写入和读取方面都相对较快。
  • 视频直播:使用云数据库MongoDB存储用户信息、礼物信息等。
  • 大数据应用:使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。

    安装

    传统方式

    # 1.下载 MongoDB
    - https://www.mongodb.com/try/download/community
    image.png
    # 2.将下载安装包上传到 linux 系统
    - tar -zxf mongodb-linux-aarch64-ubuntu2004-5.0.5.tgz
    image.png
    # 3.查看安装目录
    - ls
    bin目录 用来存放启动mongoDB的服务以及客户端链接的脚本文件等
    image.png
    image.png
    # 4.启动 MongoDB 服务
    - ./mongod —port=27017 —dbpath=../data —logpath=../logs/mongo.log
    --port 指定服务监听端口号 默认为 27017
    --dbpath 指定 mongodb 数据存放目录 启动要求目录必须存在
    --logpath 指定 mongodb 日志文件存放位置
    image.png
    注意: 由于指定日志文件因此启动时日志输出到日志中终端不显示任何日志
    # 5.客户端连接
    - ./mongo —port=27017
    image.png

    Docker方式

    # 1.拉取 mongodb 镜像
    - docker pull mongo:5.0.5
    image.png
    # 2.运行 mongo 镜像
    - docker run -d —name mongo —p 27017:27017 mongo:5.0.5
    image.png
    # 3.进入 mongo 容器
    - docker exec -it bc6c bash
    image.png

    Windows

    方式一:命令行参数方式启动

    在bin的同级目录下创建 data\db
    在bin目录中打开命令行提示符,输入以下命令
    1. mongod --dbpath=..\data\db
    默认端口为27017,如果想改变默认端口,可以使用 --port 来指定端口

    方式二: 配置文件方式启动服务

    在解压目录中新建 config 文件夹,该文件夹中新建配置文件 mongod.conf ,内如参考如下:
    1. storage:
    2. #The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
    3. dbPath: D:\Download\mongodb-win32-x86_64-2008plus-ssl-4.0.12\data\db
    详细配置项内容可以参考官方文档:https://docs.mongodb.com/manual/reference/configuration-options/
    【注意】
    1)配置文件中如果使用双引号,比如路径地址,自动会将双引号的内容转义。如果不转义,则会报错:

    error-parsing-yaml-config-file-yaml-cpp-error-at-line-3-column-15-unknown-escape-character-d

    解决:
    a. 对 \ 换成 / 或 \
    b. 如果路径中没有空格,则无需加引号。
    2)配置文件中不能以Tab分割字段
    解决:
    将其转换成空格。
    1. mongod -f ../config/mongod.conf
    2. mongod --config ../config/mongod.conf
    更多参数配置:
    ```yaml systemLog: destination: file

    The path of the log file to which mongod or mongos should send all diagnostic logging information

    path: “D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/log/mongod.log” logAppend: true storage: journal: enabled: true

    The directory where the mongod instance stores its data.Default Value is “/data/db”.

    dbPath: “D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/data” net:

    bindIp: 127.0.0.1

    port: 27017 setParameter: enableLocalhostAuthBypass: false
  1. <a name="hquJC"></a>
  2. ## 核心概念
  3. <a name="fbmNa"></a>
  4. ## 库<DataBase>
  5. mongodb中的库就类似于传统关系型数据库中库的概念,用来通过不同库隔离不同应用数据。mongodb中可以建立多个数据库。每一个库都有自己的集合和权限,不同的数据库也放置在不同的文件中。默认的数据库为"test",数据库存储在启动指定的data目录中。
  6. <a name="vcqis"></a>
  7. ### 集合<Collection>
  8. 集合就是 MongoDB 文档组,`可以理解为MySQL中表`。<br />集合存在于数据库中,一个库中可以创建多个集合。每个集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
  9. <a name="polxn"></a>
  10. ### 文档<Document>
  11. 文档集合中一条条记录,是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
  12. ```json
  13. {"site":"www.baizhiedu.xin", "name":"编程不良人"}

关系总结

RDBMS MongoDB
数据库 数据库
集合
文档
字段

库,集合<表>,文档<数据>

  1. > show databases; | show dbs;

image.png
注意:

  • **admin**: 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • **local**: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • **config**: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

    创建数据库

    1. use 库名

    image.png
    注意: use 代表创建并使用,当库中**没有数据时默认不显示**这个库
    image.png

    删除数据库

  • 默认删除当前选中的库

    1. > db.dropDatabase()

    image.png

    查看当前所在库

    1. > db;

    image.png

    集合

    查看库中所有集合

    1. > show collections; | show tables;

    image.png

    创建集合

    1. > db.createCollection('集合名称', [options])

    image.png
    options可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
size 数值 (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

注意:当集合不存在时,向集合中插入文档也会自动创建该集合。

删除集合

  1. > db.集合名称.drop();

image.png

文档

参考文档: https://docs.mongodb.com/manual/reference/method/

插入文档

  • 单条文档

    1. > db.集合名称.insert({"name":"编程不良人","age":23,"bir":"2012-12-12"});
  • 多条文档

    1. > db.集合名称.insertMany(
    2. [ <document 1> , <document 2>, ... ],
    3. {
    4. writeConcern: 1,//写入策略,默认为 1,即要求确认写操作,0 是不要求。
    5. ordered: true //指定是否按顺序写入,默认 true,按顺序写入。
    6. }
    7. )
    8. > db.集合名称.insert([
    9. {"name":"不良人","age":23,"bir":"2012-12-12"},
    10. {"name":"小黑","age":25,"bir":"2012-12-12"}
    11. ]);
  • 脚本方式

    1. for(let i=0;i<100;i++){
    2. db.users.insert({"_id":i,"name":"编程不良人_"+i,"age":23});
    3. }

    注意:在 mongodb 中每个文档都会有一个_id作为唯一标识,_id默认会自动生成如果手动指定将使用手动指定的值作为_id 的值。

    查询所有

    1. > db.集合名称.find();

    根据生成ID查询

    1. db.集合名称.findOne({"_id":ObjectId("62a84c8d724c0a2f70e49a21")})

    删除文档

    ```plsql db.集合名称.remove( , { justOne: , writeConcern: } )

— 删除id为1的 db.user.remove({_id:1} )

  1. **参数说明:**
  2. - **query** :可选删除的文档的条件。
  3. - **justOne** : 可选如果设为 true 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  4. - **writeConcern** :可选抛出异常的级别
  5. <a name="rNWhH"></a>
  6. ### 更新文档
  7. ```sql
  8. db.集合名称.update(
  9. <query>,
  10. <update>,
  11. {
  12. upsert: <boolean>,
  13. multi: <boolean>,
  14. writeConcern: <document>
  15. }
  16. );

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。 ```markdown
  • db.集合名称.update({“name”:”zhangsan”},{name:”11”,bir:new date()}) 这个更新是将符合条件的全部更新成后面的文档,相当于先删除在更新
  • db.集合名称.update({“name”:”xiaohei”},{$set:{name:”mingming”}}) 保留原来数据更新,但是只更新符合条件的第一条数据
  • db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true})
    保留原来数据更新,更新符合条件的所有数据
  • db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true,upsert:true}) `保留原来数据更新,更新符合条件的所有数据 没有条件符合时插入数据

    1. <a name="zd0G7"></a>
    2. # 文档查询
    3. **MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。**
    4. <a name="lwMFa"></a>
    5. ## 语法
    6. ```sql
    7. > db.集合名称.find(query, projection)
  • query :可选,使用查询操作符指定查询条件

  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

  1. > db.集合名称.find().pretty()

注意: pretty() 方法以格式化的方式来显示所有文档。

对比语法

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
image.png

AND

  1. > db.集合名称.find({key1:value1, key2:value2,...}).pretty()

类似于 WHERE 语句:WHERE key1=value1 AND key2=value2

OR

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

  1. > db.集合名称.find(
  2. {
  3. $or: [
  4. {key1: value1}, {key2:value2}
  5. ]
  6. }
  7. ).pretty()

类似于 WHERE 语句:WHERE key1=value1 or key2=value2

AND 和 OR 联合

类似SQL语句为:'where age >50 AND (name = '编程不良人' OR name = 'MongoDB')'

  1. > db.集合名称.find({"age": {$gt:50}, $or: [{"name": "编程不良人"},{"name": "MongoDB"}]}).pretty();

数组中查询

  1. -- 测试数据
  2. > db.集合名称.insert({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx", "美女" ], "name" : "不良人_xx_11" })
  3. -- 执行数组查询
  4. > db.users.find({likes:"看电视"})
  5. -- $size 按照数组长度查询
  6. > db.users.find({likes:{$size:3}});

模糊查询

类似 SQL 中为 'where name like '%name%''

  1. > db.users.find({likes:/良/});

注意:在 mongoDB 中使用正则表达式可以是实现近似模糊查询功能

排序

  1. > db.集合名称.find().sort({name:1,age:1}),
  2. - 1 升序 -1 降序

类似 SQL 语句为: 'order by name,age'

分页

  1. db.集合名称.find().sort({条件}).skip(start).limit(rows);

类似于 SQL 语句为: 'limit start,rows'

总条数

  1. > db.集合名称.count();
  2. > db.集合名称.find({"name":"编程不良人"}).count();

类似于 SQL 语句为: 'select count(id) from ....'

去重

  1. > db.集合名称.distinct('字段')

类似于 SQL 语句为: 'select distinct name from ....'

指定返回字段

  1. > db.集合名称.find({条件},{name:1,age:1})
  2. - 参数2: 1 返回 0 不返回 `注意:1和0不能同时使用`

$type

说明

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
image.png

使用

  1. > db.col.insert({
  2. title: 'PHP 教程',
  3. description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
  4. by: '编程不良人',
  5. url: 'http://www.baizhiedu.xin',
  6. tags: ['php'],
  7. likes: 200
  8. });
  9. > db.col.insert({
  10. title: 'Java 教程',
  11. description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
  12. by: '编程不良人',
  13. url: 'http://www.baizhiedu.xin',
  14. tags: ['java'],
  15. likes: 550
  16. });
  17. > db.col.insert({
  18. title: 'MongoDB 教程',
  19. description: 'MongoDB 是一个 Nosql 数据库',
  20. by: '编程不良人',
  21. url: 'http://www.baizhiedu.xin',
  22. tags: ['mongodb'],
  23. likes: 100
  24. });
  25. > db.col.insert({
  26. title: 2233,
  27. description: '2233 是一个 B站的',
  28. by: '编程不良人',
  29. url: 'http://www.baizhiedu.xin',
  30. tags: ['2233'],
  31. likes: 100
  32. });
  • 如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:

    1. db.col.find({"title" : {$type : 2}}).pretty();
    2. db.col.find({"title" : {$type : 'string'}}).pretty();
  • 如果想获取 “col” 集合中 tags 为 Array 的数据,你可以使用以下命令:

    1. dge
    2. db.col.find({"tags" : {$type : 'array'}}).pretty();

    索引

    https://docs.mongodb.com/manual/indexes/

    说明

    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

    原理

    image.png
    从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合层面上定义了索引,并支持对MongoDB集合中的任何字段或文档的子字段进行索引。

    操作

    1. > db.集合名称.createIndex(keys, options)
    2. > db.集合名称.createIndex({"title":1,"description":-1})

    说明: 语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
    createIndex() 接收可选参数,可选参数列表如下:

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

1、查看集合索引

  1. > db.集合名称.getIndexes()

2、查看集合索引大小

  1. > db.集合名称.totalIndexSize()

3、删除集合所有索引

  1. > db.集合名称.dropIndexes()

4、删除集合指定索引

  1. > db.集合名称.dropIndex("索引名称")

复合索引

说明: 一个索引的值是由多个 key 进行维护的索引的称之为复合索引

  1. > db.集合名称.createIndex({"title":1,"description":-1})

注意: mongoDB 中复合索引和传统关系型数据库一致都是左前缀原则
image.png
image.png

聚合

说明

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)

使用

  1. {
  2. title: 'MongoDB Overview',
  3. description: 'MongoDB is no sql database',
  4. by_user: 'runoob.com',
  5. url: 'http://www.runoob.com',
  6. tags: ['mongodb', 'database', 'NoSQL'],
  7. likes: 100
  8. },
  9. {
  10. title: 'NoSQL Overview',
  11. description: 'No sql database is very fast',
  12. by_user: 'runoob.com',
  13. url: 'http://www.runoob.com',
  14. tags: ['mongodb', 'database', 'NoSQL'],
  15. likes: 10
  16. },
  17. {
  18. title: 'Neo4j Overview',
  19. description: 'Neo4j is no sql database',
  20. by_user: 'Neo4j',
  21. url: 'http://www.neo4j.com',
  22. tags: ['neo4j', 'database', 'NoSQL'],
  23. likes: 750
  24. }

现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:

  1. > db.集合名称.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

常见聚合表达式

image.png

整合应用

说明: 这里主要以 springboot 应用为基础应用进行整合开发。
Spring Data : Spring 数据框架 JPA 、Redis、Elasticsearch、AMQP、MongoDB
JdbcTemplate
RedisTemplate
ElasticTempalte
AmqpTemplate
MongoTemplate
SpringBoot Spring Data MongoDB

环境搭建

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>
  1. # mongodb 没有开启任何安全协议
  2. # mongodb(协议)://121.5.167.13(主机):27017(端口)/baizhi(库名)
  3. spring.data.mongodb.uri=mongodb://121.5.167.13:27017/baizhi
  4. # mongodb 存在密码
  5. #spring.data.mongodb.host=tx.chenyn.cn
  6. #spring.data.mongodb.port=27017
  7. #spring.data.mongodb.database=baizhi
  8. #spring.data.mongodb.username=root
  9. #spring.data.mongodb.password=root

集合操作

  1. @Test
  2. public void testCreateCollection() {
  3. // 判断集合是否存在
  4. boolean products = mongoTemplate.collectionExists("products");
  5. if (!products) {
  6. // 创建集合 参数: 创建集合名称
  7. mongoTemplate.createCollection("products");
  8. }
  9. }

注意:创建集合不能存在,存在报错

  1. @Test
  2. public void testDeleteCollection(){
  3. mongoTemplate.dropCollection("users");
  4. }

相关注解

  • @Document
    • 修饰范围: 用在类上
    • 作用: 用来映射这个类的一个对象为 mongo 中一条文档数据,相当于把java对象转成bson
    • 属性:(value 、collection )用来指定操作的集合名称
  • @Id
    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来将成员变量的值映射为文档的_id 的值
  • @Field
    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来将成员变量以及值映射为文档中一个key、value对
    • 属性: ( name,value)用来指定在文档中 key 的名称,默认为成员变量名
  • @Transient
    • 修饰范围: 用在成员变量、方法上
    • 作用 : 用来指定改成员变量,不参与文档的序列化

      文档操作

      image.png

      查询操作

      ```java @Autowired private MongoTemplate template;

@Test public void testQuery(){ //基于 id 查询 template.findById(“1”,User.class);

//查询所有 template.findAll(User.class); template.find(new Query(),User.class);

//等值查询 template.find(Query.query(Criteria.where(“name”).is(“编程不良人”)), User.class);

// > gt < lt >= gte <= lte template.find(Query.query(Criteria.where(“age”).lt(25)), User.class); template.find(Query.query(Criteria.where(“age”).gt(25)), User.class); template.find(Query.query(Criteria.where(“age”).lte(25)), User.class); template.find(Query.query(Criteria.where(“age”).gte(25)), User.class);

//and template.find(Query.query(Criteria.where(“name”).is(“编程不良人”) .and(“age”).is(23)),User.class);

//or Criteria criteria = new Criteria() .orOperator(Criteria.where(“name”).is(“编程不良人_1”), Criteria.where(“name”).is(“编程不良人_2”)); template.find(Query.query(criteria), User.class);

//and or Criteria criteria1 = new Criteria() .and(“age”).is(23) .orOperator( Criteria.where(“name”).is(“编程不良人_1”), Criteria.where(“name”).is(“编程不良人_2”)); template.find(Query.query(criteria1), User.class);

//sort 排序 Query query = new Query(); query.with(Sort.by(Sort.Order.desc(“age”)));//desc 降序 asc 升序 template.find(query, User.class);

//skip limit 分页 Query queryPage = new Query(); queryPage.with(Sort.by(Sort.Order.desc(“age”)))//desc 降序 asc 升序 .skip(0) //起始条数 .limit(4); //每页显示记录数 template.find(queryPage, User.class);

//count 总条数 template.count(new Query(), User.class);

//distinct 去重 //参数 1:查询条件 参数 2: 去重字段 参数 3: 操作集合 参数 4: 返回类型 template.findDistinct(new Query(), “name”, User.class, String.class);

//使用 json 字符串方式查询 Query query = new BasicQuery( “{$or:[{name:’编程不良人’},{name:’徐凤年’}]}”, “{name:0}”);

template.find(query, User.class); }

  1. <a name="KLKOF"></a>
  2. ### 添加操作
  3. 实体类```java
  4. @Document("users")
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9. @Id
  10. private Integer id;
  11. @Field("username")
  12. private String name;
  13. @Field
  14. private Double salary;
  15. @Field
  16. private Date birthday;
  17. }
  1. @Autowired
  2. private MongoTemplate mongoTemplate;
  3. @Test
  4. public void test(){
  5. User user = new User(1, "张三", 3000.0, new Date());
  6. mongoTemplate.save(user);
  7. User userInsert = new User(2, "李四", 3500.0, new Date());
  8. mongoTemplate.insert(userInsert);
  9. // 参数:1.批量数据 2.放入哪个集合
  10. List<User> users = Arrays.asList(new User(4, "李四", 2800.0, new Date()),
  11. new User(5, "王五", 3800.0, new Date()));
  12. mongoTemplate.insert(users,User.class);
  13. }
  • insert:插入重复数据时(比如主键重复,或者唯一索引),insert报DuplicateKeyException提示主键重复;save对已存在的数据更新。
  • save:批处理操作时,insert可以一次性插入整个数据,效率较高;save需遍历整个数据,一次插入或更新,效率较低

    更新操作

    1. @Test
    2. public void testUpdate(){
    3. //1.更新条件
    4. Query query = Query.query(Criteria.where("age").is(23));
    5. //2.更新内容
    6. Update update = new Update();
    7. update.set("name","编程小陈陈");
    8. //单条更新
    9. mongoTemplate.updateFirst(query, update, User.class);
    10. //多条更新
    11. mongoTemplate.updateMulti(query, update, User.class);
    12. //更新插入
    13. mongoTemplate.upsert(query,update,User.class);
    14. //返回值均为 updateResult
    15. //System.out.println("匹配条数:" + updateResult.getMatchedCount());
    16. //System.out.println("修改条数:" + updateResult.getModifiedCount());
    17. //System.out.println("插入id_:" + updateResult.getUpsertedId());
    18. }

    删除操作

    1. @Test
    2. public void testDelete(){
    3. //删除所有
    4. mongoTemplate.remove(new Query(),User.class);
    5. //条件删除
    6. mongoTemplate.remove(
    7. Query.query(Criteria.where("name").is("编程不良人")),
    8. User.class
    9. );
    10. }