转自:http://www.mongoing.com/docs/tutorial/update-documents.html
更新
MongoDB提供如下方法更新集合中的文档:
db.collection.updateOne() | 即使可能有多个文档通过过滤条件匹配到,但是也最多也只更新一个文档。 3.2 新版功能. |
db.collection.updateMany() | 更新所有通过过滤条件匹配到的文档. 3.2 新版功能. |
db.collection.replaceOne() | 即使可能有多个文档通过过滤条件匹配到,但是也最多也只替换一个文档。 3.2 新版功能. |
db.collection.update() | 即使可能有多个文档通过过滤条件匹配到,但是也最多也只更新或者替换一个文档。 默认情况下, db.collection.update() 只更新 一个 文档。要更新多个文档,请使用 multi 选项。 |
这些方法接收(如下)参数:
行为表现
原子性
MongoDB中所有的写操作在单一文档层级上是原子的。更多关于MongoDB和原子性的信息,请参见 原子性和事务处理。
_id 字段
一旦设定,你不能更新 _id 字段的值,你也不能用有不同 _id 字段值的替换文档来替换已经存在的文档。
文档大小
当执行更新操作增加的文档大小超过了为该文档分配的空间时。更新操作会在磁盘上重定位该文档。
字段顺序
MongoDB按照文档写入的顺序整理文档字段,除了 如下的情况:
-
_id 字段始终是文档中的第一个字段。
-
包括字段名称的 renaming 操作可能会导致文档中的字段重新排序。
在 2.6 版更改: 从2.6版本开始,MongoDB主动尝试保持字段在文档中的顺序。 2.6版本之前,MongoDB不会主动保持文档中的字段的顺序。
Upsert 选项
如果 db.collection.update(),db.collection.updateOne(), db.collection.updateMany() 或者 db.collection.replaceOne() 包含 upsert : true 并且 没有文档匹配指定的过滤器,那么此操作会创建一个新文档并插入它。如果有匹配的文档,那么此操作修改或替换匹配的单个或多个文档。
更多关于新文档创建的细节,请参考该方法的详细页。
示例集合
本页示例使用 mongo shell 中的 db.collection.find() 方法。在 mongo shell 中,如果返回的游标没有赋给使用 var 关键字的变量,那么该游标会自动迭代20次 [1] 来打印出结果中的前20个文档。
要添加示例中涉及的 users 集合,在 mongo shell中运行如下命令:
注解
如果 users 集合中已经包含了相同 _id 值的文档,你需要在插入示例文档前 drop 该集合( db.users.drop() )。
db.users.insertMany( [ { _id: 1, name: "sue", age: 19, type: 1, status: "P", favorites: { artist: "Picasso", food: "pizza" }, finished: [ 17, 3 ], badges: [ "blue", "black" ], points: [ { points: 85, bonus: 20 }, { points: 85, bonus: 10 } ] }, { _id: 2, name: "bob", age: 42, type: 1, status: "A", favorites: { artist: "Miro", food: "meringue" }, finished: [ 11, 25 ], badges: [ "green" ], points: [ { points: 85, bonus: 20 }, { points: 64, bonus: 12 } ] }, { _id: 3, name: "ahn", age: 22, type: 2, status: "A", favorites: { artist: "Cassatt", food: "cake" }, finished: [ 6 ], badges: [ "blue", "Picasso" ], points: [ { points: 81, bonus: 8 }, { points: 55, bonus: 20 } ] }, { _id: 4, name: "xi", age: 34, type: 2, status: "D", favorites: { artist: "Chagall", food: "chocolate" }, finished: [