增加所有数组元素

时间:2014-04-09 13:02:26

标签: mongodb mongo-shell

我有这样的文件:

{
    "_id" : ObjectId("534527e489e46c16787bda0f"),
    "packages" : [
        {
            number: 1
        },
        {
            number: 2
        }
    ]
}

我想立刻增加所有packages.number。有可能吗?

我试过这个db.collection.update({}, {$inc: {"packages.number": 1}})但是没有用。

5 个答案:

答案 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 })

有关更多详细信息,请参阅文档:

https://docs.mongodb.com/manual/reference/operator/update/positional-all/#update-all-documents-in-an-array