03 MongoDB文档的各种增加、更新、删除操作总结

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 文章总结了MongoDB中文档的增删改操作,包括插入文档、更新现有文档以及删除文档的具体方法和示例。

一. 插入文档

注意: 在 MongoDB 中,直接插入内容会自动创建集合!

1.1 使用insert()方法

语法格式: db.COLLECTION_NAME.insert(document)

说明: 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

案例: 如向集合user_demo中插入一条数据:

db.user_demo.insert({
   "name":"zhangsan", "age": 18})

# 相当于sql中的
insert into user_demo(name, age) values("zhangsan", 18);
1.2 使用save()方法(新版本中已废弃)

语法格式: db.COLLECTION_NAME.save(document)

说明: 如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。

1.3 使用insertOne()方法 (3.2版本新增)

语法格式: db.collection.insertOne()

说明: 向指定集合中插入一条文档数据, 可指定参数:
writeConcern: 写入策略,默认为 1,即要求确认写操作,0 是不要求。

案例: 如向集合user_demo中插入一条数据:

db.user_demo.insertOne({
   "name":"zhangsan", "age": 18})
1.4 insertMany()方法 (3.2版本新增)

语法格式: db.collection.insertMany()

说明: 向指定集合中插入多条文档数据, 可指定参数:
writeConcern: 写入策略,默认为 1,即要求确认写操作,0 是不要求;
ordered:指定是否按顺序写入,默认 true,按顺序写入。

案例: 如向集合user_demo中插入2条数据:

db.user_demo.insertMany([{
   "name":"zhangsan", "age": 18}, {
   "name":"lisi", "age": 20}])

二. 更新文档

2.1 使用 update() 方法

语法格式:

db.collection.update(
   <query>,
   <update>,
   {
   
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

说明: 更新集合中的文档, 可指定参数:

query : update的查询条件,类似sql update查询内where后面的;
update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的;
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新;
writeConcern :可选,抛出异常的级别。

案例: 如向集合user_demo中名称为zhangsan的用户的age更新成21:

db.user_demo.update({
   'name':'zhangsan'},{
   $set:{
   'age': 21}})

# 相当于sql中的
update article set age = 21 where name > 'zhangsan';
2.2 使用 save() 方法

语法格式:

db.collection.save(
   <document>,
   {
   
     writeConcern: <document>
   }
)

说明: save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入, 可指定参数:

document : 文档数据;
writeConcern :可选,抛出异常的级别。

案例: 如向集合user_demo中替换 _id 为 56064f89ade2f21f36b03136的文档数据

db.user_demo.save({
   "_id" :          ObjectId("56064f89ade2f21f36b03136"),
    "name": "wangwu",
    "age": 23})

# 更新之后可查看结果
db.user_demo.find().pretty()
3.3 MongoDB 3.2版本新增的方法

更新一条db.collection.updateOne(), 参考:MongoDB官网-updateOne操作

更新多条db.collection.updateMany(), 参考:MongoDB官网-updateMany操作

替换1条db.collection.replaceOne(), 参考:MongoDB官网-replaceOne操作

三. 删除文档

注意:在删除文档前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。

3.1 使用 remove() 方法删除文档

语法格式: 2.6版本以后

db.collection.remove(
   <query>,
   {
   
     justOne: <boolean>,
     writeConcern: <document>
   }
)

说明:用来移除集合中的数据,参数说明:

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。

案例: 如在集合user_demo中移除名为zhangsan的数据:

db.user_demo.remove({
   "name":"zhangsan"})

db.user_demo.find()  # 发现没有名为zhangsan的数据了

# 相当于sql中的
delete from user_demo where name = "zhangsan"

注意:remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

3.2 使用 deleteOne() 方法删除文档

如删除user_demo集合下 status 等于 D 的一个文档:

db.inventory.deleteOne({ status: "D"})

3.3 使用 deleteMany() 方法删除文档

如删除user_demo集合下全部文档:db.user_demo.deleteMany({})

如删除user_demo集合下 status 等于 A 的全部文档:db.user_demo.deleteMany({status :"A"})

四. bulk-write 操作

MongoDB批量操作支持同时执行一批写操作,写操作包括:插入文档、更新文档、删除文档。

官网参考: MongoDB官网的bulk-write操作

bulkWrite 批量操作支持下面写操作自由组合。

  • insertOne - 插入一个文档
  • updateOne - 更新一个文档
  • updateMany - 更新一批文档
  • replaceOne - 替换一个文档
  • deleteOne - 删除一个文档
  • deleteMany - 删除一批文档

语法格式:

# operation - 代表写操作配置
# bulkWrite接收一个写操作数组。
db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
)

mongo shell通过db.collection.bulkWrite()函数执行批量操作。

综合案例:

db.inventory.bulkWrite(
      [
         // 插入一个文档
         {
    insertOne :
            {
   
            // 文档内容
               "document" :
               {
   
                  "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
               }
            }
         },
         {
    insertOne :
            {
   
               "document" :
               {
   
                  "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3
               }
            }
         },
         // 更新一个文档,updateMany 更新一批文档类似
         {
    updateOne :
            {
   
               // 更新条件
               "filter" : {
    "char" : "Eldon" },
               // 更新内容
               "update" : {
    $set : {
    "status" : "Critical Injury" } }
            }
         },
         // 删除一个文档,deleteMany删除多个文档类似
         {
    deleteOne :
            // 删除条件
            {
    "filter" : {
    "char" : "Brisbane" } }
         },
         // 替换一个文档
         {
    replaceOne :
            {
   
                // 替换条件
               "filter" : {
    "char" : "Meldane" },
               // 替换内容
               "replacement" : {
    "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
            }
         }
      ]
   );

附:官网crud操作:官网crud操作

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL MongoDB 数据库
MongoDB 解析:灵活文档数据库与 Docker Compose 部署
`MongoDB` 是一款开源、高性能的 `NoSQL` 数据库,以其无模式的文档存储格式(BSON)而著称,广泛应用于众多开源项目,包括但不限于 Yapi 等。它在大规模数据存储和实时数据处理方面表现出色,因此备受青睐。在本文中,我们将深入探讨 `MongoDB` 的特性,并详细阐述如何使用 Docker Compose 轻松部署 `MongoDB` 数据库,为你提供全方位的指导。
339 1
MongoDB 解析:灵活文档数据库与 Docker Compose 部署
|
2月前
|
存储 NoSQL MongoDB
MongoDB拆分大文档、嵌入文档
【7月更文挑战第6天】
35 0
|
4月前
|
存储 NoSQL 数据管理
【MongoDB 专栏】MongoDB 文档模型详解
【5月更文挑战第10天】MongoDB 是一种流行的 NoSQL 数据库,以其灵活的文档数据模型著称。文章介绍了文档的基本概念、结构及操作,包括插入、查询、更新和删除。文档特点是灵活且可扩展,适合存储不同结构的数据。优势在于简化数据建模、提升开发效率并适应动态数据。应用场景包括用户信息、日志记录和电商数据管理。但需注意数据一致性和文档大小对性能的影响。理解文档模型有助于高效利用 MongoDB。
72 1
【MongoDB 专栏】MongoDB 文档模型详解
|
4月前
|
NoSQL MongoDB 数据库
通过优化索引以消除 MongoDB 中的 "查询目标已超过1000个扫描对象/返回的文档数" 警告
MongoDB NoSQL数据库在处理复杂查询时可能出现“查询目标已超过1000个扫描对象/返回的文档数”警告。文章分析了该问题,展示了一个示例集合和相关索引,并提供了查询示例。通过`explain`命令发现查询未有效利用索引。解决方案是遵循ESR规则,创建新索引从而优化查询并消除警告。
130 1
|
3月前
|
NoSQL BI MongoDB
MongoDB 数据探索之道:查询文档操作详解
MongoDB 数据探索之道:查询文档操作详解
|
3月前
|
NoSQL 安全 MongoDB
MongoDB 数据精简指南:删除文档操作详解
MongoDB 数据精简指南:删除文档操作详解
|
3月前
|
NoSQL MongoDB 数据库
MongoDB 更新文档:灵活修改数据,实时响应需求变化
MongoDB 更新文档:灵活修改数据,实时响应需求变化
|
3月前
|
存储 JSON NoSQL
MongoDB 插入文档:轻松管理数据录入与批量导入
MongoDB 插入文档:轻松管理数据录入与批量导入
|
4月前
|
存储 JSON NoSQL
MongoDB的文档存储格式BSON和JSON的区别
MongoDB的文档存储格式BSON和JSON的区别