2016-06-20 17 views
0

Ich verwende rethinkdb mit nodejs. Ich habe eine Fonds-Tabelle und ich versuche, Kontostand eines jeden Benutzers zu berechnen, indem Sie alle Krediteinträge minus Summe Lastschrifteinträge hinzufügen. Bis jetzt konnte ich folgende Abfrage ausführen.rethinkdb Gruppierung zu Kontostand der Benutzer Mittel berechnen

r.db ('TESTDB') Tabelle ('Geldbetrag') filtern... ({UserId: '63755d1e-e82e-4072-8312-4fcd88f1dfd3'}) Gruppe (Funktion (g) { return g ('userId') })

Dies führt zu folgenden Ergebnissen.

[ 
{ 
"group": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" , 
"reduction": [ 
{ 
"createdAt": Mon Jun 06 2016 14:17:26 GMT+00:00 , 
"createdBy": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" , 
"credit": 900 , 
"id": "2afaca8e-6b4f-4ed5-a8ef-7fed3ce5ca67" , 
"userId": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" 
} , 
{ 
"createdAt": Fri Jun 17 2016 09:02:19 GMT+00:00 , 
"createdBy": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" , 
"credit": 150 , 
"id": "c023ea2d-0d28-4f4b-ae6c-1c41c49aca08" , 
"userId": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" 
} , 
{ 
"createdAt": Fri Jun 17 2016 08:54:56 GMT+00:00 , 
"createdBy": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" , 
"debit": 50 , 
"id": "89fd4a56-8722-4e86-8409-d42e4041e38d" , 
"userId": "63755d1e-e82e-4072-8312-4fcd88f1dfd3" 
} 
] 
} 
] 

Ich habe versucht, concatMap Funktion und im Inneren, die verwenden versucht Zweig zu verwenden, wenn ihre Debit- oder Kredit zu überprüfen, aber es funktioniert nicht.

this throwing errors 
r.db('testDB').table('funds').filter({userId:'63755d1e-e82e-4072-8312-4fcd88f1dfd3'}).group(function(g){ 
    return g('userId') 
}).ungroup().concatMap(function(m){ 
    //return m('reduction')('credit') 
    return r.branch (m('reduction')('credit').gt(0), 'c', 'd') 

}) 

e: Kann nicht STRING SEQUENCE in konvertieren:

eine weitere Annäherung an mich für alle Gutschriften summieren Verwendung reduzieren Funktion zur Verfügung stellen, aber ich weiß nicht, wie alle Belastungen zu summieren.

r.db('testDB').table('funds').filter({userId:'63755d1e-e82e-4072-8312-4fcd88f1dfd3'}).group(function(g){ 
    return g('userId') 
}).ungroup().concatMap(function(m){ 
    return m('reduction')('credit') 
    // return r.branch (m('reduction')('credit').gt(0), 'c', 'd') 

}) 
    .reduce(function(left, right){ 
     return left.add(right); 
    }) 

Ergebnis 1050

Antwort

2

Sie wahrscheinlich so etwas wie dies wollen:

r.db('testDB').table('funds').group('userId').map(function(row) { 
    return row('credit').default(0).sub(row('debit').default(0)); 
}).sum() 
+0

Ich habe eine Benutzer-Tabelle mit Id-Eigenschaft können Sie mir bitte sagen, wie ich das Ergebnis Ihrer querty beitreten können Benutzertabelle, damit ich E-Mail, Telefon und andere Informationen ziehen kann. Geben Sie auch den Standardwert an, wenn eine Eigenschaft im Dokument nicht verfügbar ist. Wie in Ihrem Code 0 wird für Kreditfeld injiziert werden, wenn es fehlt? – najam

+0

Am Ende können Sie '.ungroup() einfügen. Merge (function (x) {return {Benutzer: r.table ('Benutzer'). Get (x ('Gruppe'))};})'. (Und, ja, 'default' gibt den Standardwert an, wenn ein Feld fehlt, oder genauer gesagt, wenn ein Nicht-existince-Fehler bei der Auswertung seiner linken Seite auftritt.) – mlucy