我需要一个字段的查询组的结果总和。我用一个例子来解释这个。
这是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}})
答案 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)
然后才能使用