更新文档

    此页面使用以下 mongo shell方法:

    此页面上的示例使用库存收集。 要创建和/或填充清单集合,请运行以下命令:

    此页上的示例使用inventory集合。要创建和/或填充inventory集合,请运行以下操作:

    1. db.inventory.insertMany( [
    2. { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
    3. { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
    4. { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
    5. { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
    6. { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
    7. { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
    8. { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
    9. { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
    10. { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
    11. { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
    12. ] );

    更新集合中的文档

    为了更新文档,MongoDB提供了更新操作符(例如$set)来修改字段值。

    要使用更新运算符,请将以下形式的更新文档传递给更新方法:

    1. {
    2. <update operator>: { <field1>: <value1>, ... },
    3. <update operator>: { <field2>: <value2>, ... },
    4. ...
    5. }

    如果字段不存在,则某些更新操作符(例如$set)将创建该字段。 有关详细信息,请参见各个更新操作员参考。

    [success] Note

    从MongoDB 4.2开始,MongoDB可以接受聚合管道来指定要进行的修改而不是更新文档。 有关详细信息,请参见方法参考页。

    更新单个文档

    下面的示例在inventory集合上使用db.collection.updateOne()方法更新项目等于“ paper”的第一个文档:

    1. db.inventory.updateOne(
    2. { item: "paper" },
    3. {
    4. $set: { "size.uom": "cm", status: "P" },
    5. $currentDate: { lastModified: true }
    6. }
    7. )

    更新操作:

    • 使用$set 运算符将size.uom字段的值更新为“ cm”,将状态字段的值更新为“ P”,

    • 使用$currentDate运算符将lastModified字段的值更新为当前日期。 如果lastModified字段不存在,则$currentDate将创建该字段。 有关详细信息,请参见$currentDate

      更新多个文档

    3.2版中的新功能

    以下示例在清单集合上使用db.collection.updateMany()方法来更新数量小于50的所有文档:

    1. db.inventory.updateMany(
    2. { "qty": { $lt: 50 } },
    3. {
    4. $set: { "size.uom": "in", status: "P" },
    5. $currentDate: { lastModified: true }
    6. }
    7. )

    更新操作:

    • 使用$set运算符将size.uom字段的值更新为“ in”,将状态字段的值更新为“ P”.

    • 使用 $currentDate 运算符将lastModified字段的值更新为当前日期。如果lastModified字段不存在,则$currentDate 将创建该字段。有关详细信息,请参见$currentDate

      更换文档

    要替换_id字段以外的文档的全部内容,请将一个全新的文档作为第二个参数传递给db.collection.replaceOne()

    当替换一个文档时,替换文档必须只包含字段/值对;即不包括更新操作符表达式。

    替换文档可以具有与原始文档不同的字段。在替换文档中,由于_id字段是不可变的,因此可以省略_id字段。但是,如果您确实包含_id字段,则它必须与当前值具有相同的值。

    下面的示例替换了inventory集合中的第一个文件,其中项为“paper”:

    1. db.inventory.replaceOne(
    2. { item: "paper" },
    3. { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
    4. )

    行为

    原子性

    MongoDB中的所有写操作都是单个文档级别上的原子操作。有关MongoDB和原子性的更多信息,请参见原子性和事务。

    _id Field

    设置后,您将无法更新_id字段的值,也无法将现有文档替换为具有不同_id字段值的替换文档。

    字段顺序

    除以下情况外,MongoDB会在执行写操作后保留文档字段的顺序:

    • _id字段始终是文档中的第一个字段。
    • 包含字段名称renaming 的更新可能导致文档中字段的重新排序。

      增补选项

    如果updateOne(), updateMany(), or replaceOne() 包含upsert:true,并且没有文档与指定的过滤器匹配,则该操作将创建一个新文档并将其插入。 如果存在匹配的文档,则该操作将修改或替换一个或多个匹配的文档。

    有关创建的新文档的详细信息,请参见各个方法的参考页。

    写确认书

    对于写入问题,您可以指定从MongoDB请求的写入操作的确认级别。 有关详细信息,请参见写关注

    另请参考:

    译者:杨帅

    校对:杨帅

    参见

    原文 - Update Documents