我的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 字段的最大值?
答案 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]} },
}}
])