2016-04-11 15 views
2

In Python habe ich eine Liste von Wörterbüchern. Die Liste heißt members und jedes Mitglied hat eine eindeutige id. Zum Beispiel könnte die Liste wie folgt aussehen:Datenbank aus einer Liste von Wörterbüchern aktualisieren

members = [{'id':1, 'val1':10, 'val2':11}, 
      {'id':2, 'val1':2, 'val2':34}, 
      {'id':3, 'val1':350, 'val2':9}] 

Ich möchte meine Sammlung mit der Liste der Mitglieder zu aktualisieren, zu aktualisieren und neue Einträge nach Bedarf einsetzen.

Muss ich die Mitglieder durchlaufen, oder gibt es einen schnelleren Weg?

Hier ist mein Versuch, das, was zu tun scheint, ich will, aber dauert eine Weile:

for m in members: 
    collection.update_one({'id':m['id']}, {'$set': m)}, upsert = True) 

Bitte beachten Sie, dass diese mit einem anderen Wert jedes db Eintrag erfordert die Aktualisierung, nämlich die eines seiner id entspricht.

+0

Sie können auf Schlüssel über m ['id'] zugreifen. Tut m.id Zugriff auf das Attribut "id", das nicht existiert. – keksnicoh

+0

@keksnicoh yep, feste Frage – Hatshepsut

Antwort

0

Verwenden Sie update_many, wenn Sie die gleichen Werte haben.

Wenn Sie jedoch andere Werte haben, können Sie nicht zwei Dokumente gleichzeitig mit einer MongoDB-Abfrage aktualisieren. Sie müssen das immer in zwei Abfragen tun. Sie können natürlich einen Wert eines Feldes auf den gleichen Wert setzen oder mit derselben Zahl erhöhen, aber Sie können in MongoDB mit derselben Abfrage nicht zwei verschiedene Aktualisierungen durchführen.

+0

Ich bin mir nicht sicher, wie ich das auf meine Situation anwenden soll, wo ich nicht nur 'x: 1', sondern jede _different_'identifikation abgleichen und den entsprechenden db-Eintrag aktualisieren muss. – Hatshepsut

+0

@Hatshepsut, benutze $ oder um eine andere ID anzugeben – JRazor

+0

Ich habe ein Beispiel für die Art von Liste hinzugefügt, die ich habe. Könnten Sie, wenn möglich, einen Code geben, der zeigt, wie man die db mit 'val1' und' val2' entsprechend jeder eindeutigen 'id' aktualisiert? – Hatshepsut

0

Mit modernen pymongo Sie .bulk_write() mit der ReplaceOne bulk Schreiboperation in Ihrem speziellen Fall, oder einen sonst geeigneten Betrieb

from pymongo import MongoClient 
from pymongo import ReplaceOne 

client = MongoClient() 

db = client.test 

members = [ 
    { 'id': 1, 'val1': 10, 'val2': 11 }, 
    { 'id': 2, 'val1': 2, 'val2': 34 }, 
    { 'id': 3, 'val1': 350, 'val2': 9 } 
] 

db.testcol.bulk_write([ 
    ReplaceOne(
    { "id": m['id'] }, 
    m, 
    upsert=True 
) 
    for m in members 
]) 

Im Idealfall würden Sie nicht seine Verarbeitung von einer Quelle „Liste“ und stattdessen verwenden können lesen in einem externen "Stream", um die Speicheranforderungen niedrig zu halten. In ähnlicher Weise würden Sie nur die Operationsliste Argument aufbauen für 1000 Operationen sagen und dann .bulk_write() an den Server Aufruf nur für jede 1000.

Aber der springende Punkt ist, dass mit .bulk_write() Sie Ihre „Batch“ senden alle auf einmal und mit nur einer Antwort, anstatt als separate Anfragen mit separaten Antworten, was Overhead verursacht und Zeit kostet.

Auch die Verwendung dieser API-Methode verwendet tatsächlich die "Bulk API" darunter in unterstützten Servern, sondern degradiert zu den einzelnen Anrufe für Sie, wenn die Server-Version die "Bulk" -Methoden nicht unterstützt.

Verwandte Themen