使用示例 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 情况。
谢谢。