Mongodb:如果满足条件,则将元素推送到嵌套数组

时间:2021-01-12 15:06:51

标签: mongodb mongoose

我有以下收藏:

{
    "_id": 11,
    "outerArray": [
        { "_id" : 21,
          "field": {
              "innerArray" : [
                  1,
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 22,
          "field": {
              "innerArray" : [
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 23,
          "field": {
              "innerArray" : [
                  2
               ]
            }
        }
    ]
}

我需要遍历集合中的所有文档并推送到 innerArray 新元素 4,如果 innerArray 已经包含元素 1 或元素 3< /p>

我尝试这样做,其他一些与此类似,但没有按预期工作,它只推送到 innerArray 的第一个元素的 outerArray

db.collection.updateMany( 
    { "outerArray.field.innerArray": { $in: [ 1, 3 ] } },
    { $push: { "outerArray.$.field.innerArray": 4} }
)

如何让它推送到所有对应的innerArrays

1 个答案:

答案 0 :(得分:2)

这里的问题是你对很多事情的误解。

当您在查询中执行 "outerArray.field.innerArray": { $in: [ 1, 3 ] } 时,您不会只得到 innerArray where has 1 or 3.您正在获取存在这些数组的文档。

因此您正在查询整个文档。

当过滤器匹配时,您必须使用 arrayFilter 来更新值。

所以,如果我没理解错的话,你想要的查询是:

db.collection.update(
{}, //Empty object to find all documents
{
  $push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
  "arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})

示例here

注意 update 中的第一个对象是如何为空的。您必须将字段放在那里以匹配文档(而不是数组,文档)。

如果您只想更新一个文档,您必须用您想要的值填充第一个对象(查询对象),例如:{"_id": 11}

相关问题