转自: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: