我有以下文件:
{
"_ID": "234",
"sub": {
"abcId": "123",
"subElems": [
{
"abcId": "345",
"subElems": [
{
"abcId": "676",
"subElems": [
{
"abcId": "567"
},
{
"abcId": "567b",
"crit1": false,
"crit2": "someId",
"crit3": "2013-07-30T22:00:00.000+0000",
"crit4": "ABC"
},
{
"abcId": "567c",
"crit1": true,
"crit3": "2013-07-30T22:00:00.000+0000",
"crit4": "ABC"
},
{
"abcId": "567d",
"crit1": true,
"crit3": "2018-11-30T22:00:00.000+0000",
"crit4": "ABC"
}
]
},
{
"abcId": "678",
"subElems": [
{
"abcId": "568"
},
{
"abcId": "568b",
"crit1": false,
"crit2": "someId",
"crit3": "2013-07-30T22:00:00.000+0000",
"crit4": "ABC"
},
{
"abcId": "568c",
"crit1": true,
"crit3": "2013-07-30T22:00:00.000+0000",
"crit4": "ABC"
},
{
"abcId": "568d",
"crit1": true,
"crit3": "2018-11-30T22:00:00.000+0000",
"crit4": "ABC"
}
]
}
]
}
]
}
}
我需要遍历所有sub.subElems.0.subElems
(在这种情况下,嵌套文档带有abcId
676和678)
这2个对象中的每个对象都具有一个称为subElems
的对象数组。
我需要在此subElems
数组中找到与以下条件(AND,而非OR)匹配的所有对象:
crit1 = true
crit4 = ABC
crit2 = null
crit3 = more than a year ago
鉴于上面的collectin,我需要:
567c
和568c
我尝试了各种汇总。
我认为我可以做类似unwind sub.subElems.0.subElems
的事情,然后访问其subElems
数组并对其进行迭代。
我不知道该怎么做,是选择一个嵌套的对象对象(我知道其路径),然后遍历此数组中的元素,然后再次遍历那些对象中的数组。
感谢帮助和提示!
答案 0 :(得分:2)
您可以尝试以下汇总
基本上,每个数组都需要使用$map
,最后一个数组需要使用$filter
。
db.collection.aggregate([
{ "$addFields": {
"sub.subElems": {
"$map": {
"input": "$sub.subElems",
"as": "s1",
"in": {
"abcId": "$$s1.abcId",
"subElems": {
"$map": {
"input": "$$s1.subElems",
"as": "s2",
"in": {
"abcId": "$$s2.abcId",
"subElems": {
"$filter": {
"input": "$$s2.subElems",
"as": "s3",
"cond": {
"$and": [
{ "$eq": ["$$s3.crit1", true] },
{ "$eq": ["$$s3.crit4", "ABC"] },
{ "$eq": ["$$s3.crit2", undefined] },
{ "$lt": ["$$s3.crit3", "2018-11-30T22:00:00.000+0000"] }
]
}
}
}
}
}
}
}
}
}
}}
])