サンプルの mongodb 集計コレクション (http://media.mongodb.org/zips.json) を使用して、カリフォルニア州のすべての都市の人口割合を出力したいと思います。
SQL では、次のようになります。
SELECT city, population/SUM(population) as poppct
FROM (
SELECT city, SUM(population) as population
FROM zipcodes
WHERE state='CA'
GROUP BY city
) agg group by state;
これは、mongodb map/reduce を使用して実行できます。
db.runCommand({
mapreduce : "zipcodes"
, out : { inline : 1}
, query : {state: "CA"}
, map : function() {
emit(this.city, this.pop);
cache.totalpop = cache.totalpop || 0;
cache.totalpop += this.pop;
}
, reduce : function(key, values) {
var pop = 0;
values.forEach(function(value) {
if (value && typeof value == 'number' && value > 0) pop += value;
});
return pop;
}
, finalize: function(key, reduced) {
return reduced/cache.totalpop;
}
, scope: { cache: { } }
});
これは、新しい集計フレームワーク (v2.2) を使用しても実現できますか? これには、map/reduce の場合のように、何らかの形式のグローバル スコープが必要になります。
ありがとう。