如何解决在MongoDB聚合查询中展开后与OR子句匹配
我有一个像这样的MongoDB聚合查询
[{ "$match" : { "isDeleted" : false } },{ "$match" : { "$or" : [{ "arrayCol.col_1" : "Yes","arrayCol.subArrCol.col_2" : 10 },{ "arrayCol.subArrCol.col_3" : 2000 }] } },{ "$project" : { "_id" : 0,"col_0" : "$col_0","col_1" : "$arrayCol.col_1","col_2" : "$arrayCol.subArrCol.col_2","col_3" : "$arrayCol.subArrCol.col_3" } }]
目前正在返回2个如下文档
/* 1 */
{
"col_0" : "xyz","col_1" : "Yes","col_2" : [
10
],"col_3" : [
2013,1995
]
},/* 2 */
{
"col_0" : "pqr","col_2" : [
9,10
],"col_3" : [
2000,2000
]
}
现在,我想同时展开“ col_2”和“ col_3”,但它应该只返回像以前一样的文档,即col_2 = 10或col_3 = 2000的那些文档。
我的预期结果集如下,
/* 1 */
{
"col_0" : "xyz","col_2" : 10,"col_3" : 2013
},"col_2" : 9,"col_3" : 2000
}
/* 3 */
{
"col_0" : "pqr","col_3" : 2000
}
如果匹配条件是AND子句,那么我可以在展开后再次添加相同的匹配条件以消除错误的值。 但是我该如何在OR子句中解决这个问题/有人可以帮忙吗? 我是MongoDB的新手。
我的收藏集中的文件如下,
{
"_id": "1234-5f33-4703-be7f-3ea679951af3","col_0": "xyz","arrayCol": {
"col_1": "Yes","subArrCol": [
{
"col_2": 10,"col_3": 2013
},{
"col_3": 1995
}
]
}
},{
"_id": "5678-5f33-4703-be7f-3ea679951af3","col_0": "pqr","subArrCol": [
{
"col_2": 9,"col_3": 2000
},{
"col_2": 10,"col_3": 2000,"col_4": "abc"
}
]
}
}
解决方法
您可以尝试
-
$unwind
解构col_3
和col_2
数组 -
$match
您的条件
根 -
$group
删除重复的文档 -
$replaceWith
将_id对象替换为根文档
{ $match: { ... } },//skipped
{ $project: { ... } },//skipped
{ $unwind: "$col_3" },{ $unwind: "$col_2" },{
$match: {
$or: [
{
col_1: "Yes",col_2: 10
},{ col_3: 2000 }
]
}
},{ $group: { _id: "$$ROOT" } },{ $replaceWith: "$_id" }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。