ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB教程12-MongoDB更新文档

2020-09-03 09:32:04  阅读:193  来源: 互联网

标签:... 12 name ObjectId MongoDB age db 文档 id


MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。

update() 方法

update() 方法用于更新已存在的文档。语法格式如下:

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

参数说明:

  • <query>:参数设置查询条件, 也就是update的查询条件,类似sql update查询内where后面的
  • <update>:为更新操作符, 也就是update的对象和一些更新的操作符(如$,$inc,$set...)等,也可以理解为sql update查询内set后面的
  • upsert:可选, 为布尔型可选项,表示如果不存在 update 的记录,是否插入这个新的文档。true 为插入;默认为 false,不插入。
  • multi:可选, 也是布尔型可选项,默认是 false,只更新找到的第一条记录。如果为 true,则把按条件查询出来的记录全部更新, 默认是false。
  • writeConcem:可选,表示出异常的级别。
  • collation: 指定语言, collation 特性允许 MongoDB 的用户根据不同的语言定制排序规则,在 MongoDB 中字符串默认当作一个普通的二进制字符串来对比。而对于中文名称,通常有按拼音顺序排序的需求,这时就可以通过collation来实现

例如,插入多条数据后,使用 update 进行更改,代码如下:

首先插入集合myColl4中数据, 集合不存在自动创建, 这里使用的是insertMay, 和insert方法不同, 具体不同可以百度一下

> show collections  // 查看集合, 没有myColl4
myColl1
myColl2
myColl3
>
> db.myColl4.insertMany([  // 自动创建myColl4并插入数据
... {"name":"tom", "age": 18},
... {"name":"jerry", "age":17},
... {"name":"juli", "age":20}
... ])

        "acknowledged" : true,
        "insertedIds" : [  // 返回集合数据的id
                ObjectId("5f503f61e31448829d2dfbfb"),
                ObjectId("5f503f61e31448829d2dfbfc"),
                ObjectId("5f503f61e31448829d2dfbfd")
        ]
}

将 name 为 juli 的 age 更正为 25,代码如下:

> db.myColl4.find()
{ "_id" : ObjectId("5f503f61e31448829d2dfbfb"), "name" : "tom", "age" : 18 }
{ "_id" : ObjectId("5f503f61e31448829d2dfbfc"), "name" : "jerry", "age" : 17 }
{ "_id" : ObjectId("5f503f61e31448829d2dfbfd"), "name" : "juli", "age" : 20 }  // age为20
>
>
> db.myColl4.update( 
... {"name":"juli"},  // 查询条件
... {$set:{"age":25}}  // $set, 进行更新操作, age改为25
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.myColl4.find()
{ "_id" : ObjectId("5f503f61e31448829d2dfbfb"), "name" : "tom", "age" : 18 }
{ "_id" : ObjectId("5f503f61e31448829d2dfbfc"), "name" : "jerry", "age" : 17 }
{ "_id" : ObjectId("5f503f61e31448829d2dfbfd"), "name" : "juli", "age" : 25 }  // age已经改为了25

以上语句只会修改第一条发现的文档,而且如果age字段不存在也不会插入, 如果你要修改多条相同的文档,则需要设置 multi 参数为 true, 字段age不存在需要插入, 则需要设置upsert参数也会true, 如下:

> db.myColl4.update(
... {"name":"juli"},
... {$set:{"age":25}},
... {"upsert":true, "multi":true}
... )

save() 方法

MongoDB 另一个更新(修改)文档的方法是 save(),save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:

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

参数说明:

  • document : 要更新的文档数据, 如果集合内部已经存在一个与document相同的“_id”的记录,Mongodb 会把集合中的对象替换为document;如果不存在,则会插入document
  • writeConcern :可选,抛出异常的级别。

如下代码会先保存一个 _id 为 1 的记录,然后再执行 save,并对当前已经存在的数据进行修改:

> db.myColl5.insert({"_id":1, "name":"test", "age":20})
WriteResult({ "nInserted" : 1 })
>
> db.myColl5.find()
{ "_id" : 1, "name" : "test", "age" : 20 }
>
> db.myColl5.save({"_id":1, "name":"666", "age": 26})  // 集合中存在_id为1的数据, 所以替换
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.myColl5.find()  // 重新查看, 已经修改
{ "_id" : 1, "name" : "666", "age" : 26 }

如果使用 insert 插入记录,若新增数据的主键已经存在,则会抛出 DuplicateKeyException 异常提示主键重复,不保存当前数据。

更多实例

上面关于 $set, $inc... 等的使用可以想看看这里 -> 点击这里

标签:...,12,name,ObjectId,MongoDB,age,db,文档,id
来源: https://www.cnblogs.com/no-celery/p/13605805.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有