更新 MongoDB 中的多个文档

Tahseen Tauseef 2023年1月30日 2022年5月13日
  1. MongoDB 中的 updateMany() 方法
  2. MongoDB 中的 $set 运算符
  3. 在 MongoDB 中创建要更新的集合
  4. 使用 updateMany() 方法更新 MongoDB 中的多个文档
  5. 使用 updateMany() 方法更新 MongoDB 中的嵌入式文档
  6. 使用 updateMany() 方法更新 MongoDB 中的数组元素
  7. 结论
更新 MongoDB 中的多个文档

本文将讨论如何高效地更新 MongoDB 中的多个文档。

MongoDB 中的 updateMany() 方法

使用 MongoDB 中的 db.collection.updateMany() 方法,你可以更新集合中的多个文档。此方法更改与指定过滤器匹配的所有集合文档。

以下是使用此方法时的一些注意事项。

  1. 此方法仅接受具有更新的运算符表达式的文档。
  2. updateMany() 方法可用于多文档事务。
  3. 当你更新文档时,_id 字段的值不会改变。
  4. 它还为文档添加了新字段。

语法:

db.collection.updateMany(
    <filter>,
    <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, <filterdocument2>... ],
     hint: <document|string>
   }
)

参数:

  • filter:这是方法的第一个参数。它指定更新的选择标准。

    此参数的类型是文档。如果它包含一条空记录,即 {},则此方法将使用更新后的文档更新集合的所有文档。

  • update:这是方法的第二个参数。此参数类型是文档或管道,它包含对文档的更改。

    它可以是更新的文档(包含编辑运算符表达式)或聚合管道(仅包含聚合步骤,例如 $addFields$project$replaceRoot)。

可选参数:

  • upsert:此参数的值为真或假。假设此参数的值为 true

    该过程将更新满足该方案中指定标准的所有文档。如果集合中的任何文档不适合提供的过滤器,此方法将在集合中输入新文档(即更新的文档)。

    此选项的默认值为 false,其类型为布尔值。

  • writeConcern:当你不想使用默认的写入关注点时,这是唯一的选择。此选项具有参数类型文档。

  • collation:它描述排序规则将如何在操作中使用。它还允许用户建立特定于语言的字符串比较标准,例如小写和重音标记规则。

    此选项具有文档的参数类型。

  • arrayFilters:这是一个过滤器文档数组,告诉你要更改哪些数组元素以进行数组字段更新。该参数具有数组类型。

  • hint:它是一个文档或字段,指示过滤器将用于支持它的索引。它可以接受索引规范文档或索引名称字符串,如果你选择不存在的索引,它将返回错误。

  • Return: 此方法将返回一个布尔值为 true(如果 writeconcern 启用)或 false(如果 writeconcern 禁用)的文档,匹配文档数量的 matchedCount 值,modifiedCount 修改记录数的值,以及更新插入文档的 _idupsertedId 值。

MongoDB 中的 $set 运算符

你通常使用 $set 运算符来形成更新参数。它用用户给定的值替换字段的值。

语法:

{ $set: { <field1>: <value1>, <field2>: <value2>, ...}}

假设 field 不存在。然后,$set 运算符将使用记录中提供的值创建一个新字段。

如果你使用点符号定义 field,例如 embededDoc.field,,并且数据库中不存在 field$set 运算符会创建嵌入文档。

在 MongoDB 中创建要更新的集合

你可以使用以下名为 products 的集合。

db={
    "products": [
    {
        "_id": 1,
        "name": "xPhone",
        "price": 799,
        "specs": {
            "ram": 4,
            "screen": 6.5,
            "cpu": 2.66
        },
        "color": [
            "white",
            "black"
        ],
        "storage": [
            64,
            128,
            256
        ]
    },
    {
        "_id": 2,
        "name": "xTablet",
        "price": 899,
        "specs": {
            "ram": 16,
            "screen": 9.5,
            "cpu": 3.66
        },
        "color": [
            "white",
            "black",
            "purple"
        ],
        "storage": [
            128,
            256,
            512
        ]
    },
    {
        "_id": 3,
        "name": "SmartTablet",
        "price": 899,
        "specs": {
            "ram": 12,
            "screen": 9.7,
            "cpu": 3.66
        },
        "color": [
            "blue"
        ],
        "storage": [
            16,
            64,
            128
        ]
    },
    {
        "_id": 4,
        "name": "SmartPad",
        "price": 699,
        "specs": {
            "ram": 8,
            "screen": 9.7,
            "cpu": 1.66
        },
        "color": [
            "white",
            "orange",
            "gold",
            "gray"
        ],
        "storage": [
            128,
            256,
            1024
        ]
    },
    {
        "_id": 5,
        "name": "SmartPhone",
        "price": 599,
        "specs": {
            "ram": 4,
            "screen": 5.7,
            "cpu": 1.66
        },
        "color": [
            "white",
            "orange",
            "gold",
            "gray"
        ],
        "storage": [
            128,
            256
        ]
    }
]
}

使用 updateMany() 方法更新 MongoDB 中的多个文档

以下示例中使用 updateMany() 方法在价格字段值为 899. 时更新记录。

db.products.updateMany(
    {  price: 899},
    { $set: {  price: 895 }}
)

此查询中的 filter 输入是 {price: 899},,它指定要更新的文档。要应用的更改是 {$set: { price: 895}},它利用 set 运算符将 price 字段值分配给 895.

输出:

updatemany 方法

该结果文档中的 matchedCount 字段表示匹配记录的数量,而 modifiedCount 字段存储更新文档的数量。

为了验证修改,使用 find() 方法选择 price 字段值为 895, 的文档,如下所示:

db.products.find({
    price: 895
}, {
    name: 1,
    price: 1
})

输出:

updatemany 方法 2

上图显示 price 字段值已成功更新。

使用 updateMany() 方法更新 MongoDB 中的嵌入式文档

以下查询使用 find() 方法来发现 price 字段值大于 700 的文档。

db.products.find({
    price: { $gt: 700}
}, {
    name: 1,
    price: 1,
    spec: 1
})

输出:

updatemany 方法 3

updateMany() 方法用于这些文档的 spec 嵌入式文档中,用于更新 ramscreencpu 字段的值:

db.products.updateMany({
    price: { $gt: 700}
}, {
    $set: {
        "spec.ram": 32,
        "spec.screen": 9.8,
        "spec.cpu": 5.66
    }
})

输出:

updatemany 方法 4

图像中的结果表明三个文档已成功更新。

使用 updateMany() 方法更新 MongoDB 中的数组元素

updateMany() 方法在以下示例中用于更新 storage 文档数组的第一个和第二个元素,其中 _id123

db.products.updateMany({
    _id: {
        $in: [1, 2, 3]
    }
}, {
    $set: {
        "storage.0": 16,
        "storage.1": 32
    }
})

输出:

updatemany 方法 5

如果你从 products 集合中查询 _id123 的文档,storage 数组的第一个和第二个组件已被修改。

db.products.find(
    { _id: { $in: [1,2,3]}},
    { name: 1, storage: 1}
)

输出:

updatemany 方法 6

结论

通过本教程文章,你学习了如何使用 updateMany() 函数更新集合中满足条件的所有记录,并使用 $set 运算符将字段的值替换为特定值。

相关文章 - MongoDB Document