如何在顶级数组上应用“arrayFilters”?

W S*_* Si 3 arrays mongodb mongodb-query

我的问题类似于通过多个条件从嵌套数组中删除对象。主要区别在于,我想arrayFilter首先在顶级数组上应用,然后arrayFilter在匹配的顶级数组元素的嵌套数组上应用另一个。

首先,这是我从帖子中复制的文档示例,并根据我的情况进行了一些调整......

{
    "OtherField1" : ISODate("2016-05-06T05:09:14.589Z"),
    "OtherField2" : "something",
    "Distributions" : [
            {
                    "DeliveryType" : 1,
                    "DeliverySubType" : 2,
                    "DistributionData" : [
                            {
                                    "Key" : "Topic",
                                    "Value" : "Topics",
                                    "Children" : null
                            },
                            {
                                    "Key" : "Message",
                                    "Value" : "test",
                                    "Children" : null
                            }
                    ]
            },
            {
                    "DeliveryType" : 1,
                    "DeliverySubType" : 3,
                    "DistributionData" : [
                            {
                                    "Key" : "Topic",
                                    "Value" : "Topics",
                                    "Children" : ""
                            },
                            {
                                    "Key" : "Message",
                                    "Value" : "test",
                                    "Children" : null
                            }
                    ]
            }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,首先通过匹配和定位顶级Distributions数组的第二个元素,然后通过匹配和定位其嵌套数组的第一个元素,最后更新匹配的嵌套数组元素的字段。"DeliveryType" : 1"DeliverySubType" : 3DistributionData"Key": "Topic""Value" : "Topics"Children

对于顶级比赛,我尝试了以下形式......

{
  "arrayFilters": [
  { "filter1" : {
      "elemMatch" : {
         "DeliveryType" : 1,
         "DeliverySubType" : 3,
       }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

并将过滤器引用为Distributions.$[filter1]...,但它不起作用。或者,

{
  "arrayFilters": [
  { "filter1.Distributions" : {
      "elemMatch" : {
         "DeliveryType" : 1,
         "DeliverySubType" : 3,
       }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

并将过滤器引用为$[filter1].Distributions....,但它再次因解析错误而失败。

我能找到的所有示例都是关于arrayFilters在嵌套数组上使用的,我自己在这方面取得了一些成功,但无论我多么努力地尝试将相同的技巧应用于顶级数组上的过滤器,它们都失败了各种各样的错误。有人可以帮忙吗?谢谢。

dni*_*ess 5

该解决方案有些隐藏,但实际上已记录在案

db.collection.update({}, {
    $set: { "Distributions.$[distFilter].DistributionData.$[distDataFilter].Children": "new value" }
    }, {
    "arrayFilters": [
        {
            "distFilter.DeliveryType" : 1,
            "distFilter.DeliverySubType" : 3
        }, {
            "distDataFilter.Key" : "Topic",
            "distDataFilter.Value" : "Topics"
        }
    ]
})
Run Code Online (Sandbox Code Playgroud)