2016-12-13 4 views
0

Ich habe ein Wörterbuch, das wie folgt aussieht:PyMongo aktualisieren Dokument mit mehreren Datensätzen

{ 
    "username": "SHAURYA", 
    "stocks": [{ 
     "name": "WXYZ", 
     "count": 2, 
     "price": 100 
    }, { 
     "name": "GOOG", 
     "count": 3, 
     "price": 300 
    }, { 
     "name": "QQV", 
     "count": 5, 
     "price": 300 
    }, { 
     "name": "AAPL", 
     "count": 6, 
     "price": 300 
    }, { 
     "name": "SN", 
     "count": 4, 
     "price": 300 
    }] 
} 

Ich brauche auch einzelne Aktien zu aktualisieren, um der Lage sein, neue Aktien zu dieser hinzuzufügen.

Wenn ich den Befehl db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) verwende, wird die Datenbank nicht aktualisiert.

Wenn ich den Befehl db.cmpe285.update({"username":username}, {"$set": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) verwende, ersetzt es alles in den Aktien mit den neuen Informationen.

Gibt es eine Möglichkeit, die vorhandenen Datensätze zu aktualisieren oder sogar einen neuen Datensatz hinzuzufügen?

Antwort

0

MongoDB unterscheidet zwischen Groß- und Kleinschreibung. Verwenden Sie "stocks" anstelle von "Stocks" in Ihrer Push-Operation, und das Filialdokument wird korrekt an das Array angefügt.

+0

Das war ein Tippfehler. Es ist auch "Aktien" in den Befehlen. – user2123358

1

Für neue Objekte

db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) 

Für vorhandene Elemente zu aktualisieren, vorausgesetzt, Sie Zuteilung aktualisieren. Sie müssen den positionellen Operator ($) mit dem Array-Wert verwenden, auf den in der Abfrage verwiesen wird.

db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}}) 

Für upserting Artikel, es ist ein 2-Stufen-Prozess. Sie müssen zuerst die Abfrage auf die gleiche Weise wie bei der Aktualisierung vorhandener Elemente wie oben ausführen und die Ergebnisse des Schreibergebnisses aus der obigen Abfrage überprüfen und die geänderte Anzahl überprüfen. Wenn der geänderte Zählerstand 0 ist, müssen wir ihn hochladen und dann tun wir es wie beim Hinzufügen neuer Elemente.

db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}}) 

Überprüfen Sie die WriteResult, wenn nmodified gleich 0.

db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment2,"price":initial_share_price}}}) 

Wenn der nmodified gleich 1 ist, gelang es upserting.

Verwandte Themen