arrays - 如何在顶级数组上应用“arrayFilters”?
问题描述
我的问题类似于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
}
]
}
]
}
我要实现的是,首先通过匹配and定位顶层Distributions
数组的第2个元素,然后通过匹配"DeliveryType" : 1
and"DeliverySubType" : 3
定位其嵌套DistributionData
数组的第1个元素"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
在嵌套数组上使用的,我自己在这方面取得了一些成功,但无论我多么努力地将相同的技巧应用于顶级数组上的过滤器,它们都失败了各种错误。有人可以帮忙吗?谢谢。
解决方案
该解决方案有些隐藏,但实际上已记录在案:
db.collection.update({}, {
$set: { "Distributions.$[distFilter].DistributionData.$[distDataFilter].Children": "new value" }
}, {
"arrayFilters": [
{
"distFilter.DeliveryType" : 1,
"distFilter.DeliverySubType" : 3
}, {
"distDataFilter.Key" : "Topic",
"distDataFilter.Value" : "Topics"
}
]
})
推荐阅读
- c# - WOPI主机禁用自动保存
- javascript - 如何在 JavaScript 中使用关键字“this”进行 DOM 操作
- reactjs - 如何在本机反应中使用星号?
- django - 为什么 Django 不加载内置静态文件?
- jquery - li上的多个JQuery Click事件
- python - 打印文本文件中的最小数值
- xml - qweb 报告中未呈现图像 - Odoo 11
- java - 在递归线程池结构中使用 jsoup 时出现问题
- angular - Angular Elements 应该被用作跨多个 Angular 应用程序的可重用组件吗?
- javascript - 从 Express 提供的静态 html 文件中的 Javascript 脚本标记无法正确加载