在mongodb中迭代双嵌套数组
我有以下文件:在mongodb中迭代双嵌套数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下文件: { "_ID": "234", "sub": { "abcId": "123", "subElems": [ { "abcId": "345", "subElems": [ { "abcId": "676", "subElems": [ { "abcId": "567"
{
"_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的嵌套文档)
这两个元素中的每一个都有一个名为子元素的对象数组
我需要在此子元素数组中查找符合以下条件(AND、not或)的所有项目:
鉴于上述情况,我需要:
567c
和568c
我尝试过各种聚合
我想我可以做一些类似于展开sub.subElems.0.subElems
的事情,然后访问它的subElems
数组并对其进行迭代
我不知道如何做的是选择一组嵌套的对象(我知道它们的路径),然后迭代这个数组中的元素,再迭代这些对象中的数组
谢谢你的帮助和提示 您可以在下面尝试
基本上,您需要使用每个数组和最后一个数组
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"] }
]
}
}
}
}
}
}
}
}
}
}}
])
嗨,非常感谢!我如何更改此项以便取回整个文档?为什么您会特别地使用“abcId”:“$$s1.abcId”?我删除了它,我似乎仍然可以工作。是的,它可以工作,但是你的abcId
键将从嵌套数组中消失,你将只得到子元素,我们在$map
函数的in
表达式中定义了它
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"] }
]
}
}
}
}
}
}
}
}
}
}}
])