OPTIONS
翻译或纠错本页面

修改文档

MongoDB提供了 update() 方法来更新一个集合的文档。这个方法接收如下作为参数:

  • 一个更新条件文档用来匹配要更新的文档

  • 一个更新操作文档用来指定要执行的修改操作

  • 一个选项文档

可以使用和查询条件相同的结构和语法指定更新的条件。

By default, update() updates a single document. To update multiple documents, use the multi option.

更新一个文档中指定的字段

MongoDB提供了 更新操作符 来更改一个字段的值,比如修改值的 $set

一些更新操作符,比如 $set ,在字段不存在的时候将创建这个字段。参见个别的 更新操作符 教程。

1

使用更新操作符来改变字段值

对于有字段 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.

2

更新一个内嵌字段

使用 dot notation 来更新一个内嵌文档的字段。当使用点符号的时候,要用引号将全部有点的字段名括起来。

下例更新内嵌文档 details 中的 model 字段。

db.inventory.update(
  { item: "ABC1" },
  { $set: { "details.model": "14Q2" } }
)

更新操作返回一个包含操作状态的 WriteResult 对象。一个成功的文档更新返回如下的对象:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
3

更新多个文档

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 字段,那么它必须要与现有的值保持一致。

1

替换一个文档

下面的操作替换含有 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)。

1

为更新替换操作指定 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.

值为 1nUpserted 表示这个更新添加了一个新的文档。

值为 0nModified 说明没有存在的文档被更新了。

The _id field shows the generated _id field for the added document.

2

为更新特定字段操作指定 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.

值为 1nUpserted 表示这个更新添加了一个新的文档。

值为 0nModified 说明没有存在的文档被更新了。

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.