与MongoDB聚合查询中Unwind后的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_1" : "Yes",
"col_2" : [
9,
10
],
"col_3" : [
2000,
2000
]
}

现在我想放松两个";col_ 2";以及";col_ 3";,但它应该只返回那些像以前一样的文档,即col2=10或col3=2000的文档。

我的预期结果如下,

/* 1 */
{
"col_0" : "xyz",
"col_1" : "Yes",
"col_2" : 10,
"col_3" : 2013
},
/* 2 */
{
"col_0" : "pqr",
"col_1" : "Yes",
"col_2" : 9,
"col_3" : 2000
}
/* 3 */
{
"col_0" : "pqr",
"col_1" : "Yes",
"col_2" : 10,
"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",
"arrayCol": {
"col_1": "Yes",
"subArrCol": [
{
"col_2": 9,
"col_3": 2000
},
{
"col_2": 10,
"col_3": 2000,
"col_4": "abc"
}
]
}
}

你可以试试,

  • $unwind解构col_3col_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" }

游乐场

最新更新