Mongodb 按聚合中的索引投影嵌套数组字段值
我正在MongoDB中进行聚合,它在Mongodb 按聚合中的索引投影嵌套数组字段值,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在MongoDB中进行聚合,它在$project阶段应该有一个数组字段投影。但我无法通过数组字段的索引访问它们: {//projection stage $project: { 'foo' : { '$ifNull' : ['$bar.0.baz.0.qux', '*'] } } } 这将foo设置为空数组。bar是一个多维数组字段。我的MongoDB版本是3.2。如果没有$unwind/$group旧的繁重解决方案的麻烦,我可以为此做些什么 感谢您的帮助。使用,并: {“
$project
阶段应该有一个数组字段投影。但我无法通过数组字段的索引访问它们:
{//projection stage
$project: {
'foo' : { '$ifNull' : ['$bar.0.baz.0.qux', '*'] }
}
}
这将foo
设置为空数组。bar是一个多维数组字段。我的MongoDB版本是3.2。如果没有$unwind/$group
旧的繁重解决方案的麻烦,我可以为此做些什么
感谢您的帮助。使用,并:
{“$project”:{
“foo”:{
“$ifNull”:[
{“$arrayElemAt”:[
{“$map”:{
“输入”:{“$slice”:[
{“$map”:{
“输入”:{“$slice”:[“$bar”,0,1]},
“as”:“el”,
“在”:“$$el.baz”
}},
0, 1
]},
“as”:“el”,
“in”:{“$arrayElemAt”:[“$$el.qux”,0]}
}},
0
]},
"*"
]
}
}}
因此,内部$map
运算符允许您从每个数组中选择特定字段,您可以在所需位置$slice
仅返回该元素。i、 e0,1
是零索引,只有一个元素
对于最终生成的数组,您只需使用$arrayElemAt
并检索索引元素,将其转换为单个值
当然,$ifNull
测试可能需要更多的参与,这取决于您的结构,如果它不一致,那么您可能需要检查每个$map
输入并相应地交换结果
但总的过程是:
获取字段$map
从$slice
$map
显示最终数组结果$arrayElemAt
关于这样的事情:
db.foo.insert({
“酒吧”:[
{
“baz”:[
{“qux”:2},
{“qux”:5}
]
},
{
“baz”:[
{“qux”:3},
{“qux”:4}
]
}
]
})
产生:
{“_id”:ObjectId(“56e8c6b8ff2a05c0da90b31e”),“foo”:2}
使用带有临时字段的$arrayElemAt运算符的多个$project阶段
{$project:{“tmp”:{$arrayElemAt:[“$bar”,0]}},
{$project:{“tmp2”:{$arrayElemAt:[“$tmp.baz”,0]}}}
你的价值是$tmp2.qux。谢谢你,伙计。我试图理解这个解决方案。它似乎工作得很好。我很快会核对你的答案。遗憾的是,他们没有用简单的javascript对象访问模式替换这个巨大的代码片段。希望在以后的版本中看到这一点。