MongoDB教程12-MongoDB更新文档

网友投稿 851 2022-10-17

MongoDB教程12-MongoDB更新文档

MongoDB教程12-MongoDB更新文档

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

update() 方法

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

db.collection.update( , , { upsert: , multi: , writeConcern: ,   collation: })

参数说明:

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

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

> show collections  // 查看集合, 没有myColl4myColl1myColl2myColl3>> 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( , { writeConcern: })

参数说明:

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

如下代码会先保存一个 _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 异常提示主键重复,不保存当前数据。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty分布式源码分析监听读事件
下一篇:swoft - 首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~