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旧的繁重解决方案的麻烦,我可以为此做些什么 感谢您的帮助。使用,并: {“

我正在MongoDB中进行聚合,它在
$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、 e
0,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对象访问模式替换这个巨大的代码片段。希望在以后的版本中看到这一点。