【发布时间】:2016-05-28 23:03:16
【问题描述】:
我需要按字段分组查询的结果总和。我用一个例子来解释。
这是 find() 的结果
{ "_id" : ObjectId("5749a5fd7aed9ced75b94218"), "groupValue" : "5", "weight" : 123 }
{ "_id" : ObjectId("5749a5fd7aed9ced75b94219"), "groupValue" : "5", "weight" : 345 }
{ "_id" : ObjectId("5749a5fd7aed9ced75b9421a"), "groupValue" : "2", "weight" : 1 }
{ "_id" : ObjectId("5749a5fd7aed9ced75b9421b"), "groupValue" : "2", "weight" : 2 }
{ "_id" : ObjectId("5749a5fd7aed9ced75b9421c"), "groupValue" : "5", "weight" : 567 }
现在我想要一个结果,其中为 groupValue 的所有权重计算总和。
这个例子我想要
(123 + 345 + 567)mod(5)
and
(1+2)mod(2)
找到的解决方案: 我用自己的解决方案解决了它。 我注册了一个新的javascript函数:
db.system.js.save(
{
_id : "getModulus" ,
value : function (x, modulus){ return x % modulus; }
}
);
现在加载它:
db.loadServerScripts();
现在我创建了两个函数:map、reduce。
var map = function () {
var key = {groupValue: this.groupValue};
emit(key, {weight: this.weight, groupValue: this.groupValue});
};
var reduce = function (key, values) {
var sum = 0;
var groupValue = 0;
values.forEach( function (value) {
sum += value['weight'];
groupValue = value['groupValue'];
});
var number = getModulus(sum, groupValue);
return {weight: number};
};
现在调用我的 mapReduce:
db.hits.mapReduce(map, reduce, {out: {inline:1}})
【问题讨论】:
-
不清楚你想要什么。你只想要总和吗?
5中的mod(5)是什么 -
给定两个数,a(被除数)和 n(除数),模 n(缩写为 mod n)是 a 除以 n 的余数。例如,表达式“7 mod 5”的计算结果为 2,因为 7 除以 5 余数为 2,而“10 mod 5”的计算结果为 0,因为 10 除以 5 余数为 0。跨度>
-
你没有回答我的问题。
5和2是“groupValue”字段值吗?
标签: mongodb mongodb-query aggregation-framework