如何在MongoDB中聚合数组中的文档而不是集合中的文档?
我的MongoDB数据库中有以下集合cidade:如何在MongoDB中聚合数组中的文档而不是集合中的文档?,mongodb,mongodb-query,aggregation-framework,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); 问题是,正如我艰难地发现的那样,对于resultado2这样
{
"_id" : 0,
"nome" : "CIDADE0",
"qtdhab" : 1231043
}
所以,这是我想做的。我尝试在MongoDB中执行与此SQL查询等效的操作:
SELECT MAX(QTDHAB) FROM CIDADE WHERE QTDHAB <= (SELECT AVG(QTDHAB) FROM CIDADE);
问题是,正如我艰难地发现的那样,对于resultado2这样的数组,没有.aggregate方法,因此最后一个查询返回一个错误。有没有其他方法可以从这两个查询生成的文档数组中获取字段qtdhab的最大值
我们看不到您的文档,但您基本上希望从每个数组中获取第一个结果,然后从中计算出一些值。但首先需要解构数组。请看,或者至少在这里发布一些人们可以使用的内容。对不起,我已经用文档结构更新了帖子。文档结构与数组有什么关系?我在那里看不到阵列。还是文档中的数组元素?我认为包含数组的实际文档是这里的重要部分。没有包含数组的文档。我提到的数组是由查询生成的数组,没有查询生成的数组,只有游标。旧版本的MongoDB返回聚合结果是数组,还有
.distinct()
和.mapReduce()
方法。调用.toArray()
将从光标返回一个数组。但除此之外,没有数组作为结果。请在你的问题中更清楚地说明你在做什么。非常感谢你的回答!不过我不熟悉$cond,所以在测试之前,我会阅读文档以了解您的代码。完成后,我会在这里发表评论。
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"}}})
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]} },
}}
])