【问题标题】:Return sum with modulus GROUP BY返回带模数 GROUP BY 的总和
【发布时间】: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。跨度>
  • 你没有回答我的问题。 52 是“groupValue”字段值吗?

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

试试这个查询

    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) 然后只有它会工作

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 2014-05-08
    • 2018-02-12
    • 2023-03-20
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多