返回总和模数GROUP BY

时间:2016-05-28 14:15:54

标签: mongodb mongodb-query aggregation-framework

我需要一个字段的查询组的结果总和。我用一个例子来解释这个。

这是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}})

1 个答案:

答案 0 :(得分:0)

尝试此查询

    db.getCollection('collectionName').aggregate( [ 
{ $group : { _id : "$groupValue" ,total:{$sum:"$weight"}} },
{ $project : { _id:0,groupValue : "$_id" , total : "$total" ,
    remainder: { $mod: [ "$total", "$_id" ] } } }] )

它的工作正常,还有一件事请更改groupValue字段(String to Number)然后才能使用

相关问题