2016-05-28 5 views
0

Ich brauche eine Summe der Ergebnisse einer Abfrage Gruppe von einem Feld. Ich erkläre dies mit einem Beispiel.Return-Summe mit Modul GROUP BY

Dies ist das Ergebnis von 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 } 

Jetzt mag ich ein Ergebnis, bei denen die Summe für alle das Gewicht eines groupValue berechnet wird.

Für dieses Beispiel möchte ich

(123 + 345 + 567)mod(5) 
and 
(1+2)mod(2) 

SOLUTION finded: ich es mit meiner eigenen Lösung gelöst. ich eine neue JavaScript-Funktion registriert:

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

es jetzt laden: db.loadServerScripts();

Jetzt erstelle ich zwei Funktion: Karte, reduzieren.

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}; 
}; 

und jetzt meine verkleinern nennen:

db.hits.mapReduce(map, reduce, {out: {inline:1}}) 
+0

Es ist unklar, was du willst. Willst du nur die Summe? Was ist '5' in' mod (5) ' – styvane

+0

Gegeben zwei Zahlen, a (die Dividende) und n (der Divisor), ist ein Modulo n (abgekürzt als eine mod n) der Rest aus der Division von a durch n. Zum Beispiel würde der Ausdruck "7 mod 5" zu 2 ausgewertet werden, weil 7 geteilt durch 5 einen Rest von 2 ergibt, während "10 mod 5" zu 0 ausgewertet würde, weil die Division von 10 durch 5 einen Rest von 0 ergibt. – aRaKaNoiD

+0

beantwortete meine Frage nicht. Ist '5' und' 2' der Feldwert "groupValue"? – styvane

Antwort

0

Diese Abfrage

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

seine Arbeit gut und eine weitere Sache, bitte (String to Number) groupValue Feld dann nur ändern, wird es funktionieren

+0

habe ich mit meiner eigenen Lösung gelöst. – aRaKaNoiD

+0

okay gut, mache ich auch gleich mit einfachen Weg – karthi