更新 MongoDB 中的多个文档
-
MongoDB 中的
updateMany()
方法 -
MongoDB 中的
$set
运算符 - 在 MongoDB 中创建要更新的集合
-
使用
updateMany()
方法更新 MongoDB 中的多个文档 -
使用
updateMany()
方法更新 MongoDB 中的嵌入式文档 -
使用
updateMany()
方法更新 MongoDB 中的数组元素 - 结论
本文将讨论如何高效地更新 MongoDB 中的多个文档。
MongoDB 中的 updateMany()
方法
使用 MongoDB 中的 db.collection.updateMany()
方法,你可以更新集合中的多个文档。此方法更改与指定过滤器匹配的所有集合文档。
以下是使用此方法时的一些注意事项。
- 此方法仅接受具有更新的运算符表达式的文档。
updateMany()
方法可用于多文档事务。- 当你更新文档时,
_id
字段的值不会改变。 - 它还为文档添加了新字段。
语法:
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
修改记录数的值,以及更新插入文档的_id
的upsertedId
值。
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.
。
输出:
该结果文档中的 matchedCount
字段表示匹配记录的数量,而 modifiedCount
字段存储更新文档的数量。
为了验证修改,使用 find()
方法选择 price
字段值为 895,
的文档,如下所示:
db.products.find({
price: 895
}, {
name: 1,
price: 1
})
输出:
上图显示 price
字段值已成功更新。
使用 updateMany()
方法更新 MongoDB 中的嵌入式文档
以下查询使用 find()
方法来发现 price
字段值大于 700
的文档。
db.products.find({
price: { $gt: 700}
}, {
name: 1,
price: 1,
spec: 1
})
输出:
updateMany()
方法用于这些文档的 spec
嵌入式文档中,用于更新 ram
、screen
和 cpu
字段的值:
db.products.updateMany({
price: { $gt: 700}
}, {
$set: {
"spec.ram": 32,
"spec.screen": 9.8,
"spec.cpu": 5.66
}
})
输出:
图像中的结果表明三个文档已成功更新。
使用 updateMany()
方法更新 MongoDB 中的数组元素
updateMany()
方法在以下示例中用于更新 storage
文档数组的第一个和第二个元素,其中 _id
为 1
、2
和 3
。
db.products.updateMany({
_id: {
$in: [1, 2, 3]
}
}, {
$set: {
"storage.0": 16,
"storage.1": 32
}
})
输出:
如果你从 products
集合中查询 _id
为 1
、2
和 3
的文档,storage
数组的第一个和第二个组件已被修改。
db.products.find(
{ _id: { $in: [1,2,3]}},
{ name: 1, storage: 1}
)
输出:
结论
通过本教程文章,你学习了如何使用 updateMany()
函数更新集合中满足条件的所有记录,并使用 $set
运算符将字段的值替换为特定值。