更新 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.

输出:

更新 MongoDB 中的多个文档

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

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

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

输出:

更新 MongoDB 中的多个文档

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

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

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

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

输出:

更新 MongoDB 中的多个文档

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

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

输出:

更新 MongoDB 中的多个文档

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

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

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

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

输出:

更新 MongoDB 中的多个文档

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

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

输出:

更新 MongoDB 中的多个文档

结论

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