mongo中的Match和Average继续产生空值

时间:2018-08-07 17:23:49

标签: mongodb

我正在使用控制台执行聚合,使用$ 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 }

1 个答案:

答案 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 ]
           }
       }
   }
})