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

Mongodb 按条件更新数组中的多个对象,mongodb,Mongodb,假设数据库中有这样一个对象: { _id: <...>, arrayOfObjects: [ { criteria: "one", value: 5 }, { criteria: "two", value: 5 }, { criteria: "three",

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

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

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

有可能做到这一点吗?执行此操作的最佳方式是什么?

使用此查询

{$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更新的更多信息,请查看此链接

编辑了我的答案

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

使用此查询

{$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更新的更多信息,请查看此链接

编辑了我的答案


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

您必须作为两个独立的
update
命令来执行此操作,因为只标识匹配的第一个数组元素:

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

您必须作为两个独立的
更新
命令来执行此操作,因为只标识匹配的第一个数组元素:

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

我不知道您为什么不能运行Michai的查询,因为我认为这是正确的。因此,我张贴我的答案。首先,您不能在一个查询中完成此操作。是的,听起来很可笑,但问题是:

也许这是一个好主意,在那里写或更新这个问题,可能在未来几个月他们会解决它。但从2010年后的创建时间来看,我高度怀疑:-(

因此,以下是一些解决方法: 首先,如果没有太多的条件,则可以使用多个查询执行此操作:

db.coll.update({
  _id: <...>,
  'arrayOfObjects.criteria': 'Criteria 1'
}, {
  'arrayOfObjects.$.value': {
     $inc: -1
   }
})
db.coll.update({
_id:,
“arrayOfObjects.criteria”:“criteria 1”
}, {
“arrayOfObjects.$.value”:{
$inc:-1
}
})
只要你有不同的标准,就要做很多次

但是如果有太多的条件,你可能会浪费太多的查询。因此,在任何情况下,你都可以在两个查询中完成这项工作

  • 根据您的条件读取对象。
    db.coll.find({'arrayOfObjects.criteria':{$in:['one','three']})
  • 在应用程序级别修改它
  • 保存在mongo

  • 我不知道你为什么不能运行Michai的查询,因为我认为它是正确的。因此我发布了我的答案。首先,你不能在一个查询中完成这项工作。是的,听起来很可笑,但问题是:

    也许这是一个好主意,在那里写下或更新这个问题,也许在未来几个月他们会解决它。但从2010年后的创建时间来看,我高度怀疑:-(

    因此,以下是一些解决方法: 首先,如果没有太多的条件,则可以使用多个查询执行此操作:

    db.coll.update({
      _id: <...>,
      'arrayOfObjects.criteria': 'Criteria 1'
    }, {
      'arrayOfObjects.$.value': {
         $inc: -1
       }
    })
    
    db.coll.update({
    _id:,
    “arrayOfObjects.criteria”:“criteria 1”
    }, {
    “arrayOfObjects.$.value”:{
    $inc:-1
    }
    })
    
    只要你有不同的标准,就要做很多次

    但是如果有太多的条件,你可能会浪费太多的查询。因此,在任何情况下,你都可以在两个查询中完成这项工作

  • 根据您的条件读取对象。
    db.coll.find({'arrayOfObjects.criteria':{$in:['one','three']})
  • 在应用程序级别修改它
  • 保存在mongo

  • 很抱歉,我无法理解查询。您是否愿意编写一个实际示例,说明这在js客户端中是什么样子的?很抱歉,您的示例不起作用,我看不出它是如何工作的。更新的查询部分选择整个文档,并且认为无法像您尝试的那样仅选择文档的一部分进行更新在此,我很抱歉,我无法理解查询。您是否愿意编写一个实际的示例,说明这在js客户端中是什么样子的?抱歉,但是您的示例不起作用,我看不出它是如何起作用的。更新的查询部分选择整个文档,并且相信无法为像您这样的更新只选择文档的一部分在这里试过