2016-05-28 6 views
0

クエリグループの結果の合計がフィールドで必要です。これを例を使って説明します。モジュラスとの和を返すGROUP BY

この検索の結果()

{ "_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) 

SOLUTIONのFINDEDたい: を私は自分のソリューションでそれを解決しました。 、マップ減らす:今、私は2つの関数を作成 db.loadServerScripts();

db.system.js.save(
{ 
_id : "getModulus" , 
value : function (x, modulus){ return x % modulus; } 
} 
); 

今、それを読み込む: は、私は新しいJavaScript関数を登録しました。

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

に動作しますあなたが望むものは不明です。あなただけの合計が欲しいですか? – styvane

+0

2つの数a(被除数)とn(除数)が与えられたとき、モジュロn(mod nと略記)は、aをnで除算した剰余です。たとえば、「7 mod 5」という表現は、5で割った7が2の剰余を残すため、2と評価されますが、「10 mod 5」は10で5の除算が0の残りを残すため、0と評価されます。 – aRaKaNoiD

+0

私の質問に答えなかった。 '5'と' 2'は "groupValue"フィールド値ですか? – styvane

答えて

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)を変更してくださいだけでは

+0

私自身の解決策で解決しました。 – aRaKaNoiD

+0

大丈夫ですが、単純な方法で集約も同じです – karthi