クエリグループの結果の合計がフィールドで必要です。これを例を使って説明します。モジュラスとの和を返す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}})
に動作しますあなたが望むものは不明です。あなただけの合計が欲しいですか? – styvane
2つの数a(被除数)とn(除数)が与えられたとき、モジュロn(mod nと略記)は、aをnで除算した剰余です。たとえば、「7 mod 5」という表現は、5で割った7が2の剰余を残すため、2と評価されますが、「10 mod 5」は10で5の除算が0の残りを残すため、0と評価されます。 – aRaKaNoiD
私の質問に答えなかった。 '5'と' 2'は "groupValue"フィールド値ですか? – styvane