- MongoDB CRUD 操作 >
- MongoDB CRUD 教程 >
- 修改文档
修改文档¶
MongoDB提供了 update() 方法来更新一个集合的文档。这个方法接收如下作为参数:
一个更新条件文档用来匹配要更新的文档
一个更新操作文档用来指定要执行的修改操作
一个选项文档
可以使用和查询条件相同的结构和语法指定更新的条件。
By default, update() updates a single document. To update multiple documents, use the multi option.
更新一个文档中指定的字段¶
MongoDB提供了 更新操作符 来更改一个字段的值,比如修改值的 $set 。
一些更新操作符,比如 $set ,在字段不存在的时候将创建这个字段。参见个别的 更新操作符 教程。
使用更新操作符来改变字段值¶
对于有字段 item 等于 "MNO2" 的文档,使用 $set 操作符来修改 category 字段和 details 字段为指定的值,并且使用 $currentDate 操作符来修改 lastModified 字段值为当前的时间。
db.inventory.update(
{ item: "MNO2" },
{
$set: {
category: "apparel",
details: { model: "14Q3", manufacturer: "XYZ Company" }
},
$currentDate: { lastModified: true }
}
)
更新操作返回一个包含操作状态的 WriteResult 对象。一个成功的文档更新返回如下的对象:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
The nMatched field specifies the number of existing documents matched for the update, and nModified specifies the number of existing documents modified.
更新一个内嵌字段¶
使用 dot notation 来更新一个内嵌文档的字段。当使用点符号的时候,要用引号将全部有点的字段名括起来。
下例更新内嵌文档 details 中的 model 字段。
db.inventory.update(
{ item: "ABC1" },
{ $set: { "details.model": "14Q2" } }
)
更新操作返回一个包含操作状态的 WriteResult 对象。一个成功的文档更新返回如下的对象:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更新多个文档¶
By default, the update() method updates a single document. To update multiple documents, use the multi option in the update() method.
把 所有 包含值为 "clothing" 的 category 字段的文档中的 category 字段改为 "apparel" 以及 lastModified 字段改为当前日期。
db.inventory.update(
{ category: "clothing" },
{
$set: { category: "apparel" },
$currentDate: { lastModified: true }
},
{ multi: true }
)
更新操作返回一个包含操作状态的 WriteResult 对象。一个成功的文档更新返回如下的对象:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
替换文档¶
要想替换一个文档除 _id 字段外的所有内容,可以传一个完整的新文档作为 update() 方法的第二个参数。
替换文档可以包含与原来文档不同的字段。在替换文档中,由于 _id 字段是不可变的,所以你可以省略 _id 字段。如果你确实要包含 _id 字段,那么它必须要与现有的值保持一致。
替换一个文档¶
下面的操作替换含有 item 字段等于 "BE10"``的文档。新被替换的文档将仅仅包含 ``_id 字段以及替换文档中包含的字段。
db.inventory.update(
{ item: "BE10" },
{
item: "BE05",
stock: [ { size: "S", qty: 20 }, { size: "M", qty: 5 } ],
category: "apparel"
}
)
更新操作返回一个包含操作状态的 WriteResult 对象。一个成功的文档更新返回如下的对象:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
upsert 选项¶
默认情况下,如果没有文档匹配更新条件, update() 将不做任何事情。
然而,可以通过指定 upsert: true 参数, update() 方法更新匹配的文档,如果没有匹配文档的情况下,它则插入一个新的使用更新条件的文档(or inserts a new document using the update specification if no matching document exists)。
为更新替换操作指定 upsert: true 。¶
当你为一个替换文档的更新操作指定了 upsert: true 并且没有匹配文档的时候,MongoDB使用与更新条件文档中相同的条件创建一个新的文档,并且使用更新文档替换除 _id 字段外的现有文档。( except for the _id field if specified 稍微有点问题)
下面的操作在有文档匹配时把将文档换成新的文档,或者在没有匹配成功时候添加一个新文档。
db.inventory.update(
{ item: "TBD1" },
{
item: "TBD1",
details: { "model" : "14Q4", "manufacturer" : "ABC Company" },
stock: [ { "size" : "S", "qty" : 25 } ],
category: "houseware"
},
{ upsert: true }
)
无论 db.collection.update() 方法修改了一个已存在文档还是添加了一个新的文档,这个更新操作都返回一个包含操作状态的 WriteResult 对象
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("53dbd684babeaec6342ed6c7")
})
The nMatched field shows that the operation matched 0 documents.
值为 1 的 nUpserted 表示这个更新添加了一个新的文档。
值为 0 的 nModified 说明没有存在的文档被更新了。
The _id field shows the generated _id field for the added document.
为更新特定字段操作指定 upsert: true 。¶
当你为一个修改特定字段的更新操作指定了 upsert: true 并且没有发现匹配文档的时候,MongoDB使用与更新条件文档中相等的条件创建一个新的文档,并且在更新文档中按照指定的一样进行修改。
下面的更新操作要么更新一个匹配文档的指定字段,要么在没有匹配文档的时候添加一个新的文档。
db.inventory.update(
{ item: "TBD2" },
{
$set: {
details: { "model" : "14Q3", "manufacturer" : "IJK Co." },
category: "houseware"
}
},
{ upsert: true }
)
无论 db.collection.update() 方法修改了一个已存在文档还是添加了一个新的文档,这个更新操作都返回一个包含操作状态的 WriteResult 对象
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("53dbd7c8babeaec6342ed6c8")
})
The nMatched field shows that the operation matched 0 documents.
值为 1 的 nUpserted 表示这个更新添加了一个新的文档。
值为 0 的 nModified 说明没有存在的文档被更新了。
The _id field shows the generated _id field for the added document.
更多的例子和方法¶
更多的例子,请参照 db.collection.update() 中的 更新例子 。
The db.collection.findAndModify() and the db.collection.save() method can also modify existing documents or insert a new one. See the individual reference pages for the methods for more information and examples.