0

我有这样的文件:

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

我想packages.number一次全部增加。可能吗?

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

4

5 回答 5

2

不,这是不可能的,原因是在使用位置$运算符时给出的。这就是说,即使在使用时,您也只会找到第一个匹配项。

因此,您没有做的事情是尝试匹配数组中的某些内容,其中您在位置运算符中获得一个值以用作索引,如下所示:

db.collection.update(
    { "packages.number": 1 },
    { "$inc": { "packages.$.number": 1 } }
)

但一般来说,您不能一次更新数组的所有成员,您只能检索文档,然后在回写之前在客户端代码中更新。

于 2014-04-09T13:10:42.273 回答
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}}) 
... })
于 2014-04-09T13:45:15.703 回答
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])

这将更新所需的文件

于 2014-04-09T13:30:14.120 回答
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

于 2021-06-09T09:22:30.433 回答
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
        }
    }
)
于 2017-11-11T16:33:03.693 回答