如何将文档聚合到数组中而不是 MongoDB 中的集合中?

How can I aggregate the documents in an array instead of in a collection in MongoDB?

我的 MongoDB 数据库中有以下集合 cidade

{ 
    "_id" : 0, 
    "nome" : "CIDADE0", 
    "qtdhab" : 1231043 
}

所以,这就是我想要做的。我正在尝试在 MongoDB:

中执行与此 SQL 查询等效的操作
SELECT MAX(QTDHAB) FROM CIDADE WHERE QTDHAB <= (SELECT AVG(QTDHAB) FROM CIDADE);

基本上,我想要集合 cidade 中字段 qtdhab最大 值它遵循的条件是低于同一个集合qtdhab的同一个字段的平均值 cidade.所以,我将其映射到 3 个查询中,如下所示:

var resultado = db.cidade.aggregate({"$group": {"_id": null, "avgHab": {"$avg": "$qtdhab"}}}).toArray()
var resultado2 = db.cidade.find({qtdhab: {$lte: resultado[0].avgHab}}).toArray()
resultado2.aggregate({"$group": {"_id": null, "maxHab": {"$max": "$qtdhab"}}})

问题是,正如我发现的那样困难,没有 .aggregate 数组的方法,例如 resultado2 ,所以最后一个查询returns出错了。我还有其他方法可以从这两个查询生成的文档数组中获取字段 qtdhab 最大值 吗?

您可以仅使用一个查询(聚合)来实现此目的:

db.cidade.aggregate([
    /*find the avg and keep also the aggregated field*/
    {"$group": {
        "_id": null, 
        "qtdhab" : {"$push" :"$qtdhab"},
        "avgHab": {"$avg": "$qtdhab"}
    }},
    /*unwind the array*/
    {$unwind: "$qtdhab"},
    /*get the max from the fields less than the avg*/
    {"$group": {
        "_id": null, 
        "res" : {"$max" : {$cond :[{$lte :["$qtdhab", "$avgHab"]}, "$qtdhab", null]} },
    }}
])