我的问题类似于Remove Object from Nested Array by Multiple Criteria。主要区别在于,我想先在顶级数组上应用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
}
]
}
]
}
我要实现的是,首先通过匹配Distributions
和"DeliveryType" : 1
来定位顶级"DeliverySubType" : 3
数组的第二个元素,然后找到第一个元素通过匹配DistributionData
和"Key": "Topic"
对其嵌套的"Value" : "Topics"
数组进行排序,最后更新匹配的嵌套数组元素的Children
字段。
对于顶级比赛,我尝试了以下形式...
{
"arrayFilters": [
{ "filter1" : {
"elemMatch" : {
"DeliveryType" : 1,
"DeliverySubType" : 3,
}
}
}
}
并将过滤器引用为Distributions.$[filter1]...
,但是它不起作用。
或者,
{
"arrayFilters": [
{ "filter1.Distributions" : {
"elemMatch" : {
"DeliveryType" : 1,
"DeliverySubType" : 3,
}
}
}
}
并将过滤器引用为$[filter1].Distributions....
,但是它再次由于解析错误而失败。
我能找到的所有示例都是关于在嵌套数组上使用arrayFilters
的,我自己在这方面取得了一些成功,但是无论我多么努力地将相同的技巧应用于顶部的过滤器,级别数组,它们只是因各种错误而失败。有人可以帮忙吗?谢谢。
答案 0 :(得分:2)
该解决方案有些隐藏,但实际上是documented:
db.collection.update({}, {
$set: { "Distributions.$[distFilter].DistributionData.$[distDataFilter].Children": "new value" }
}, {
"arrayFilters": [
{
"distFilter.DeliveryType" : 1,
"distFilter.DeliverySubType" : 3
}, {
"distDataFilter.Key" : "Topic",
"distDataFilter.Value" : "Topics"
}
]
})