我有这样的文件:
{
"_id" : ObjectId("534527e489e46c16787bda0f"),
"packages" : [
{
number: 1
},
{
number: 2
}
]
}
我想立刻增加所有packages.number
。有可能吗?
我试过这个db.collection.update({}, {$inc: {"packages.number": 1}})
但是没有用。
答案 0 :(得分:2)
不可能,并且使用positional $
运算符给出了原因。这说明即使在使用时你也只能找到第一次匹配。
所以你没有做的就是尝试匹配数组中的某些东西,在这里你得到位置运算符中的一个值,用作索引:
db.collection.update(
{ "packages.number": 1 },
{ "$inc": { "packages.$.number": 1 } }
)
但一般情况下,您无法一次更新数组的所有成员,只能检索文档,然后在写回之前更新客户端代码。
答案 1 :(得分:1)
你可以这样做。
// Store document in Array
temp = db.collection.find().toArray()
// Iterate Array and update the number
temp[0].packages.forEach(function(x){x.number += 1})
// Save the updated array in Collection
db.collection.save(temp[0])
这将更新所需文件
答案 2 :(得分:1)
在shell中,您可以使用cursor.forEach
运行这样的命令来遍历数组元素并递增每个元素:
> db.collection.find().forEach(function(doc){
... doc.packages.forEach(function(elem){elem.number+=1});
... db.collection.update({_id:doc._id}, {$set:{packages:doc.packages}})
... })
答案 3 :(得分:0)
这是可能的, 因为mongodb允许多个字段increment:
{ $inc: { field1: amount1, field2: amount2, ... } }
并将数组视为不同的字段:
" packages.0.number" //这是1 " packages.1.number" // 2
你可以做到
db.collection.findOneAndUpdate(
{ "_id" : ObjectId("534527e489e46c16787bda0f") },
{
"$inc": {
"packages.0.number": 1, // which is 1
"packages.1.number": 1 // 2
//... and so on, you might want a loop to build the updates
}
}
)
答案 4 :(得分:0)
从 3.6 版开始,您可以使用 $[]
运算符:
db.collection.update({}, {$inc: {"packages.$[].number": 1}})
请注意,如果您想更新多个文档中的所有数组元素,您需要添加 { multi: true }
可选参数:
db.collection.update({}, {$inc: {"packages.$[].number": 1}}, { multi: true })
有关更多详细信息,请参阅文档: