我正在使用控制台执行聚合,使用$ match检查嵌套字段是否存在,然后推送到group和$ avg运算符。但是,该匹配有效,对同一个变量也很好,并且count的代码也适用,但是当达到平均值时,我每次都返回null。
我正在以.0为例的数组中查找第一个元素,然后在字段中寻找该元素。这非常令人困惑并且难以调试。有什么建议吗?不同显示我查看的值都是数字afaik。有什么调试建议吗?
db.b.aggregate([ {$match: {"x.x.x.0.x": {$exists: true} } }, {$group: {_id: null, myAvg: { $avg: "$x.x.x.0.x"}}}])
结果:
{ "_id" : null, "myAvg" : null }
答案 0 :(得分:2)
相对于您实际可以在哪里使用"array.n"
表示法访问数组的第n个元素的地方,这似乎是聚合框架的限制。
更精确地讲,给出以下示例文档:
db.test.insertOne({
"a" : [
{
"x" : 1.0
}
]
})
...您可以执行以下操作以检索"a"
数组的第一个元素与1
匹配的所有文档:
db.test.aggregate({
$match: {
"a.0.x": 1
}
})
但是,您不能运行以下命令:
db.test.aggregate({
$project: {
"a0x": "$a.0.x"
}
})
您可以,但是它将返回一个空数组,这确实有点令人惊讶:
{
"_id" : ...,
"a0x" : []
}
但是,在这种情况下,有一个特殊的运算符$arrayElemAt
可以访问第n个元素,如下所示:
db.test.aggregate({
$project: {
"a0x": { $arrayElemAt: [ "$a.x", 0 ] },
}
})
请注意,这将仅返回第n个元素-因此不再嵌套在数组中:
{
"a0x" : 1.0
}
所以您可能想做的是:
db.b.aggregate({
$group: {
_id: null,
myAvg: {
$avg: {
$arrayElemAt: [ "$x.x.x.x", 0 ]
}
}
}
})