2014-10-17 66 views
2

彙總收集和I組有用戶的集合,它看起來是這樣的:我如何通過場數

{ 
    "_id": ObjectId("54380a817a4b612a38e87613"), 
    "email": "[email protected]", 
    "ogp": [BIG NESTED COLLECTION... {}, {}, {}] 
    "created": ISODate("2012-02-28T23:10:07Z"), 
    "o_id": ObjectId("5438096f7a4b612a38e445f4") 
    "geo": {"country":"US", "city":"Seattle", "longitude": 123, "latitude":123} 

} 

我想按國家,總讓所有的用戶的位置,並將它們組合。事情是這樣的:

[ {country:"US",total:250,000}, {country:"GB",total:150,000}, ... ] 

目前我只是抓住所有的文件和解析它在服務器上:

db.users.find({'geo.country': {$ne: null},'geo.city': {$ne: null}}, {'geo.country':1}, function(err, doc) { 
    var data; 
    doc = _.groupBy(doc, function(par) { return par.geo.country; }); 
    data = []; 
    return _.each(doc, function(item, key, obj) { 
     return data.push([key, obj[key].length]); 
    }); 
}); 

的問題,這是有600,000+文件和查詢約需1分鐘執行。 「聚合」功能是否有助於加快查詢速度?如果是的話,我會怎麼做呢?

回答

1

這應做到:

db.myCollection.aggregate([ 
    {"$group": {_id: "$geo.country", count:{$sum:1}}} 
])