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在嵌套数组上使用的,我自己在这方面取得了一些成功,但无论我多么努力地尝试将相同的技巧应用于顶级数组上的过滤器,它们都失败了各种各样的错误。有人可以帮忙吗?谢谢。
该解决方案有些隐藏,但实际上已记录在案:
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)
| 归档时间: |
|
| 查看次数: |
1505 次 |
| 最近记录: |