1

假设数据库中有这样的对象:

{
    _id: <...>,
    arrayOfObjects: [
        {
            criteria: "one",
            value: 5
        },
        {
            criteria: "two",
            value: 5
        },
        {
            criteria: "three",
            value: 5
        },
        {
            criteria: "four",
            value: 5
        },

    ]
}

我想做的是运行类似于以下内容的更新:

{
    $inc: {
        "arrayOfObjects.2.value" : -1
    }
}

但是我需要它只影响某些元素,例如 {$or: [{criteria: "one"}, {criteria: "three"}]} 我不能依赖数组索引,因为我拥有的对象副本可能在执行更新(可以在数组中插入、删除、重新排列对象)。

有可能做到这一点吗?这样做的最佳方法是什么?

4

3 回答 3

1

您必须将其作为两个单独update的命令执行,因为$位置运算符仅标识匹配的第一个数组元素:

db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'one'},
    {'arrayOfObjects.$.value': {$inc: -1}})
db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'three'},
    {'arrayOfObjects.$.value': {$inc: -1}})
于 2012-11-09T20:46:00.550 回答
0

使用此查询

{$or: [{arrayOfObjects.criteria: "one"}, {arrayOfObjects.criteria: "three"}]}

为了您的更新

编辑:

尝试这个

collectionName.update({arrayOfObjects.criteria: "one"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);

collectionName.update({arrayOfObjects.criteria: "three"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);

另外,请查看此链接以获取有关mongodb 更新 的更多信息http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29

编辑了我的答案。

@JohnnyHK 是对的。它需要 2 个查询。我的错。太晚了,我累了:)

于 2012-11-09T19:45:38.243 回答
0

我不知道为什么你不能运行 Michai 的查询,因为在我看来它是正确的。所以我发布我的答案。首先,您不能在一个查询中执行此操作。是的,听起来很荒谬,但事情是这样的:https ://jira.mongodb.org/browse/SERVER-1243

可能这是一个好主意,在那里写或支持这个问题,并且可能在接下来的几个月内他们会解决它。但从 2010 年后的创建时间来看,我非常怀疑:-(

所以这里有一些解决方法,你可以如何做到这一点:首先,如果没有很多标准,你可以使用多个查询来做到这一点:

db.coll.update({
  _id: <...>,
  'arrayOfObjects.criteria': 'Criteria 1'
}, {
  'arrayOfObjects.$.value': {
     $inc: -1
   }
})

并根据不同的标准多次执行此操作。

但是如果有太多的标准,你可能会浪费太多的查询。因此,无论如何您都可以在两个查询中执行此操作。

  1. 根据您的标准读取对象。db.coll.find( {'arrayOfObjects.criteria' : { $in: ['one', 'three'] }})
  2. 在您的应用程序级别修改它
  3. 将其保存在 mongo
于 2012-11-10T01:13:04.063 回答