2014-12-08 14 views
5

Ich versuche, die Daten meines Wörterbuchs in meiner Datenbank über PyMongo zu speichern.PyMongo mehrere Datensätze mit mehreren Daten aktualisieren

client = MongoClient('ip', port) 
db = client.test_database 
hdd = db.hdd 

     products[{ 
     'Speed' : 'a', 
     'Capacity' : 'b', 
     'Format' : 'c' 
     } 
     { 
     'Speed' : 'd', 
     'Capacity' : 'e', 
     'Format': 'f'}] ... 

Meine Datenbank hat eine Tabelle hdd mit 7 Feldern und 4 von ihnen sind bereits gefüllt. Die Werte Speed, capacity und format sind "" und müssen durch die Daten products ersetzt werden. Ich möchte die leeren Felder mit den Daten des Wörterbuchs füllen. Gibt es eine Möglichkeit, hdd so zu aktualisieren, und wenn es möglich ist, wie?

Antwort

3

Ich nehme an, Sie haben eine Art von "_id" Wert mit jeder Gruppe von Werten verbunden, so dass Sie wissen, welches Dokument in Ihrer Sammlung zu aktualisieren? Nennen wir das "product_id". Sie können wie einzelne Dokumente aktualisieren:

for product, product_id in data: 
    hdd.update({'_id': product_id}, 
       {'$set': {'Speed': products['Speed'], 
         'capacity': products['capacity'], 
         'format': products['format']}}) 

Das erste Argument ist eine Abfrage zu aktualisieren, die, das Dokument legt entsprechen der zweite ist ein Satz von update operations.

Wenn Sie auf MongoDB sind 2.6 oder höher und die neuesten PyMongo, ein Bulk-Update verwenden:

bulk = hdd.initialize_ordered_bulk_op() 
for product, product_id in data: 
    bulk.find({'_id': product_id}).update({'$set': {'Speed': products['Speed'], 
                'capacity': products['capacity'], 
                'format': products['format']}}) 
bulk.execute() 

Die Operationen auf dem Client zwischengespeichert werden, dann sind sie alle an den Server gesendet und ausgeführt zu einmal wenn Sie "execute()" aufrufen. Bulk update operations mit PyMongo und MongoDB 2.6+ erfordern weniger Rundläufe zum Server als herkömmliche Updates.

+0

Können Sie nicht einfach eine ganze Sammlung an die update_many-Methode übergeben, statt sie zu durchlaufen? Angenommen, Sie möchten alle Datensätze aktualisieren? cursor = db.collection.update_many({}, myposts, upsert=True)> – Noah

+0

das funktioniert einfach nicht für mich. Myposts ist eine Reihe von Dokumenten. – Noah

Verwandte Themen