按条件更新数组中的多个对象

时间:2012-11-09 19:20:00

标签: mongodb

让我们说db中有一个这样的对象:

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

    ]
}

我想要做的是运行类似于:

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

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

是否可以将其关闭?这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

您必须以两个单独的update命令执行此操作,因为$ positional operator仅标识匹配的第一个数组元素:

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

答案 1 :(得分: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个查询。我的错。已经很晚了,我累了。)

答案 2 :(得分: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中