如何将文档聚合到数组中而不是 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]} },
}}
])
我的 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]} },
}}
])