2017-09-26 1 views
1

Ich glaube, es gibt keine Abkürzung, aber immer noch überprüfen wollte.Kombinieren Abfrage erhalten mit Einfügen Abfrage

sagen, dass ich eine Sammlung haben, die

[{ 
userName: "Mr. A" 
income: 100 
expense: null 
finalBalance: 200 
timestamp: Date.now() 
}] 

* wie folgt aussieht, wenn wir Einkommen Betrag haben, Kosten null sein wird, und umgekehrt Restbetrag = (Summe der Erträge) - (Summe der Kosten) Stack: mongodB + node.js

Grundsätzlich muss man den kürzesten und besten Weg kennen, um neue Objekte in die Kollektionen einzufügen, was immer die Berechnung von "finalBalance" beinhaltet.

Currettly, was ich tue, ist jedes Mal, wenn ich eine neue Transaktion wie oben gezeigt einfügen muss. Ich hole die letzte Transaktion für diesen Benutzer mit "timestamp" und "userName", und dann hinzufügen oder subtrahieren Sie die Einkommen oder Aufwand Betrag und erstellen Sie das neue Objekt und einfügen.

Zum Beispiel:

letzte Transaktion des Benutzers:

{ 
userName: "Mr. A" 
income: 100 
expense: null 
finalBalance: 200 
timestamp: Date.now() 
} 

benötigen neue Transaktion für Benutzer mit Details

({userName: "Mr. A", expense: 10}) 

Schritt 1 einzufügen: (erhalten von DB) Holt den letzten Transaktion für Benutzer aus DB, um den letzten "finalBalance" zu erhalten.

Schritt 2: subtrahiert die "Kosten" Menge von "finalBalance" neue "finalBalance" zu erhalten, die sein wird (200-10 = 190)

Schritt 3: (Einsatz in DB) Stellen Einsatz

{ 
userName: "Mr. A" 
income: null 
expense: 10 
finalBalance: 190 
timestamp: Date.now() 
} 

Gibt es eine Möglichkeit, wie wir den neuen "finalBalance" berechnen und das neue Objekt mit einem DB-Aufruf einfügen können?

Es wäre toll, wenn die Lösung mit mongo.js

Antwort

0

Sie ist nicht Ihr eigenes Dokument Werte verwenden, sie zu aktualisieren. Also, um diese Art von Operationen durchzuführen, müssen Sie find es und iterieren über es mit forEach. Dann wird es Ihnen Ihr Dokument geben (s), und Sie werden sie ändern können, und save sie:

var yourObj = {userName: "Mr. A", expense: 10}; 
db.collection.find({yourObj.userName}).forEach(doc => { 
    doc.finalBalance = doc.finalBalance - yourObj.expense; 
    doc.timestamp: Date.now(); 

    db.events.save(doc); 
}) 

Probieren Sie es aus und mir sagen, ob es wie erwartet funktioniert,

Hoffe, dass es hilft,
Mit freundlichen Grüßen

+0

Hallo Danke für den Vorschlag werde ich das ausprobieren. Aber das wird nicht funktionieren. Da ich eine einzelne Abfrage für das vollständige Ding benötige, die in der Frage nicht erwähnt wird, aber ich mache, stelle viele ein, die diese Abfrage verwenden, da ich ein Array oder solche Transaktionen eingefügt habe. Aber wenn diese Art von Abfrage nicht geschrieben werden kann, kann ich Ihren Vorschlag verwenden. –