2017-12-07 1 views
0

Ich habe folgende Zeitreihen Array (mit dem Namen „data“), in einem mongodb Dokument verschachtelt:Wie kann ich ein MongoDB-Zeitreihen-Array ohne Duplikate korrekt aktualisieren?

"_id" : ObjectId("5a235e645bb1000704593960"), 
"data" : [ 
    { 
     "Volume" : NumberLong(41527200), 
     "Adj Close" : 171.850006, 
     "High" : 172.139999, 
     "Low" : 168.440002, 
     "Date" : ISODate("2017-11-30T00:00:00.000+0000"), 
     "Close" : 171.850006, 
     "Open" : 170.429993 
    }, 
    { 
     "Volume" : NumberLong(39726100), 
     "Adj Close" : 171.050003, 
     "High" : 171.669998, 
     "Low" : 168.5, 
     "Date" : ISODate("2017-12-01T00:00:00.000+0000"), 
     "Close" : 171.050003, 
     "Open" : 169.949997 
    }, 
    { 
     "Volume" : NumberLong(39759300), 
     "Adj Close" : 171.050003, 
     "High" : 171.669998, 
     "Low" : 168.5, 
     "Date" : ISODate("2017-12-01T00:00:00.000+0000"), 
     "Close" : 171.050003, 
      "Open" : 169.949997 
     }, 

    ], 
    "ticker" : "AAPL", 
    "last_update" : ISODate("2017-12-07T00:00:00.000+0000") 
} 

Mein Problem ist, dass, wenn ich die Zeitreihen aktualisieren, einige Array-Elemente für ein bestimmtes Datum ändern können. Zum Beispiel gibt es im Array 2 Datensätze für 2017-12-01. Alle Felder sind identisch mit Ausnahme von "Volume". Wenn ich das Array jedoch aktualisiere, wird ein neuer Datensatz zu dem Array hinzugefügt, anstatt den vorhandenen 2017-01-01-Datensatz zu aktualisieren.

Ich bin derzeit die Aktualisierung das Dokuments mit dem folgenden:

self.__db.equity_data.update({'ticker': ticker, 
           'last_update': {'$lt': record['last_update']}}, 
          {'$set': {'last_update':record['last_update']}, 
           '$addToSet': {'data': {'$each': record['data']}}}, 
           upsert=True 
           ) 

Gibt es eine Möglichkeit, die ich, dass ein doppeltes Element (basierend auf dem Datum) gewährleisten kann, ist nicht auf das Array hinzugefügt, und stattdessen aktualisiere die bestehendes Array-Element?

Danke für jede Hilfe.

Antwort

0

Ich bin nicht vertraut mit Pymongo, aber haben Sie versucht Einstellung upsert Flagge zu false? Es sollte verhindern, dass neue Dokumente erstellt werden, anstatt die alten zu aktualisieren, wenn die restlichen Anweisungen korrekt sind. Außerdem sollten Sie versuchen, das multi-Flag hinzuzufügen, da der obige Code standardmäßig nur ein Dokument aktualisiert. Viel Glück!

+0

Danke für die Antwort. Ich glaube Upsert gilt für die Dokumentebene. Dies ist auf Array-Ebene. Ich könnte mich jedoch irren. Ich habe versucht, upsert = False, aber das hat nicht das gewünschte Ergebnis. –

Verwandte Themen