如果数组包含来自另一个数组的值,如何更新文档?

时间:2017-08-04 11:01:10

标签: arrays mongodb mongodb-query

假设以下集合myCollection

{
    values: [123, 456, 789],
    name: "name1"
},
{
    values: [123, 543, 654],
    name: "name2"
},
{ 
    values: [456, 876, 098],
    name: "name3"
}

如何仅更新values包含给定数组中任何值的文档?

示例:

var givenArray = [123, 078, 467];
db.myCollection.update(
    {values:{$in:givenArray}},// <-- here is the problem
    {$set:{updated:true}},
    {multi:true}
);

由于values是一个数组,$in不起作用(当然,我猜单.update不起作用)

预期输出应为:

{
    values: [123, 456, 789],
    name: "name1",
    updated: true
},
{
    values: [123, 543, 654],
    name: "name2",
    updated: true
},
{ 
    values: [456, 876, 098],
    name: "name3"
}

更新

有效的解决方案如下,但它似乎不是最佳的:

db.myCollection.find().forEach(function(doc){
  givenArray.forEach(function(item){
    if (doc.values.indexOf(item)>=0) {
      db.myCollection.update(
        {_id:doc._id},
        {
          $set:{updated:true}
        },
        {
          multi:true
        }
      )
    }
  })
})

谢谢。

2 个答案:

答案 0 :(得分:0)

如果要匹配givenArray的所有值,请使用$ all

    {values:{$all:givenArray}}

如果你想匹配你的givenArray的一个值,那么使用$ in(你做了并且应该工作,即使是数组,请参阅this:使用$ in运算符来匹配数组中的值)

答案 1 :(得分:0)

db.yourColllection.update({values:{$ elemMatch:{$ in:[123,078,467]}}},{$ set:{updated:true}},{multi:true}); 应该是您正在寻找的最佳解决方案。