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

Mongodb:如果满足条件,则将元素推送到嵌套数组,mongodb,mongoose,Mongodb,Mongoose,我有以下收藏: { "_id": 11, "outerArray": [ { "_id" : 21, "field": { "innerArray" : [ 1, 2, 3 ]

我有以下收藏:

{
    "_id": 11,
    "outerArray": [
        { "_id" : 21,
          "field": {
              "innerArray" : [
                  1,
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 22,
          "field": {
              "innerArray" : [
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 23,
          "field": {
              "innerArray" : [
                  2
               ]
            }
        }
    ]
}
如果
innerArray
已包含元素
1
或元素
3
,我需要浏览集合中的所有文档并推送到
innerArray
新元素
4

我试着这样做,很少有其他类似的方法,但它没有像预期的那样工作,它只推到
outerArray的第一个元素
innerray

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

如何将它推送到所有共同响应的
内部数组

这里的问题是您对copule事物的错误理解

当您在查询中执行
“outerArray.field.innerArray”:{$in:[1,3]}
时,您得到的不仅仅是
innerArray
,其中有1或3。您正在获取存在这些数组的文档

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

当过滤器匹配时,必须使用更新值

因此,如果我理解正确,您需要的查询是:

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

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


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

为MongoPlayGrand网站投票,但不知道它存在!