代码之家  ›  专栏  ›  技术社区  ›  disruptive

mongo中的match和average保持生成空值

  •  0
  • disruptive  · 技术社区  · 6 年前

    我使用控制台来执行聚合,使用$匹配来检查嵌套字段是否存在,然后推到组和$AVG运算符。然而,匹配工作在相同的变量上是很好的,并且计数的代码也是有效的,但是当涉及到平均值时,我每次都返回空值。

    我在一个0数组中查找第一个元素,然后在一个字段中查找该元素。调试非常困难和困难。有什么建议吗?Distinct显示我看到的值都是数字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 回复  |  直到 6 年前
        1
  •  2
  •   dnickless    6 年前

    这似乎是聚集框架的局限性,关于您可以在何处实际使用 "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 ]
               }
           }
       }
    })