2015-08-31 84 views
-1

我有以下收集CIDADE我的MongoDB数据库:如何在数组中集合文档而不是在MongoDB的集合中?

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

所以,这里就是我想要做的。我试图做到这一点的SQL查询的MongoDB中的等价物:

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"}}}) 

的问题是,因为我发现了艰辛的道路,有一个数组,例如resultado2没有.aggregate方法,所以最后的查询返回一个错误。是否有任何其他方式让我获得最大值的字段qtdhab在这2个查询生成的这组文件中?

+0

我们无法看到您的文档,但你要基本上做这样的事情,从每个阵列获取的第一批成果,然后制定出一些值从那。但首先你需要解构阵列。所以看['$ unwind'](http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/),或者至少在这里发布一些人们可以使用的东西。 –

+0

对不起,我已更新文档结构的帖子。 – Don

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

非常感谢您的回复!我不熟悉$ cond,所以我会在测试之前阅读文档以理解您的代码。当我完成后,我会在这里发表评论。 – Don

+0

经过测试,非常完美,谢谢。 – Don

相关问题