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

时间:2015-08-31 12:15:36

标签: mongodb mongodb-query aggregation-framework

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

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

所以,这就是我想做的事情。我试图在MongoDB中执行相当于这个SQL查询的内容:

SELECT MAX(QTDHAB) FROM CIDADE WHERE QTDHAB <= (SELECT AVG(QTDHAB) FROM CIDADE);

基本上,我希望来自 cidade 的字段 qtdhab 最大值遵循低于的条件同一集合 cidade 上相同字段 qtdhab 的平均值。所以,我已将其映射为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"}}})

问题是,正如我发现困难的方法,对于 resultado2 等数组没有 .aggregate 方法,所以最后一个查询返回错误。有没有其他办法让我从这两个查询生成的这些文档中获取 qtdhab 字段的最大值

1 个答案:

答案 0 :(得分:1)

您只需使用一个查询(聚合)即可实现此目的:

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]} },
    }}
])