MongoDB incremental mapReduce, wählen Sie nur neue Dokumente aus, die nach dem letzten mapReduce hinzugefügt wurden

8

Nehmen wir an, ich habe eine Sammlung mit Dokumenten, die so aussehen (nur vereinfachtes Beispiel, aber es sollte das Schema zeigen):

%Vor%

Jetzt muss ich einige Statistiken über diese Sammlung sammeln. Zum Beispiel:

%Vor%

sammelt die Gesamtsummen in der 'stat'-Sammlung.

%Vor%

An diesem Punkt ist alles perfekt, aber ich habe den nächsten Schritt gemacht:

  1. Datensammlung wird ständig mit neuen Daten aktualisiert (alte Dokumente bleiben unverändert, nur Einfügungen, keine Aktualisierungen)
  2. Ich möchte die "stat" -Auflistung regelmäßig aktualisieren, möchte aber nicht jedes Mal die gesamte Datensammlung abfragen, also wähle ich inkrementelles mapReduce
  3. aus
  4. Es mag gut sein, die 'stat'-Sammlung nur für jede Einfügung in' data'-Sammlung zu aktualisieren und keinen mapReduce zu verwenden, aber der reale Fall ist komplexer als dieses Beispiel und ich möchte Statistiken nur bei Bedarf erhalten / li>
  5. Dazu sollte ich nur Dokumente abfragen können, die nach meinem letzten mapReduce
  6. hinzugefügt wurden
  7. Soweit ich weiß, kann ich mich nicht auf die ObjectId-Eigenschaft verlassen, sondern nur die letzte speichern und später jedes Dokument mit ObjectId & gt; gespeichert, weil ObjectId in SQL-Datenbanken nicht den Autoinkrement-IDs entspricht (beispielsweise erzeugen verschiedene Shards unterschiedliche ObjectIds).
  8. Ich kann den ObjectId-Generator ändern, bin mir aber nicht sicher, wie man es besser in einer sharded environment
  9. macht

Die Frage ist also:

Gibt es eine Möglichkeit, nur Dokumente auszuwählen, die nach dem letzten mapReduce hinzugefügt wurden, um inkrementelles mapReduce auszuführen, oder gibt es eine andere Strategie, um statistische Daten über eine ständig wachsende Sammlung zu aktualisieren?

    
Hitosu 17.10.2011, 13:13
quelle

4 Antworten

4

Sie können die Zeit zwischenspeichern und als Barriere für Ihre nächste inkrementelle Kartenreduzierung verwenden.

Wir testen das bei der Arbeit und es scheint zu funktionieren. Korrigiere mich, wenn ich falsch liege, aber du kannst nicht sicher Map-Reducing durchführen, während ein Insert über Shards hinweg passiert. Die Versionen werden inkonsistent und Ihre Map-Reduce-Operation schlägt fehl. (Wenn Sie eine Lösung dafür finden, lassen Sie es mich wissen!)

Wir verwenden stattdessen alle 5 Minuten Bulk-Inserts. Sobald alle Bulk-Inserts fertig sind, führen wir das Map-Reduce wie folgt aus (in Python):

%Vor%

Beachten Sie, dass wir reduce und nicht merge verwendet haben, weil wir nicht das überschreiben wollen, was wir vorher hatten; Wir wollen die alten Ergebnisse und das neue Ergebnis mit derselben Reduzierungsfunktion kombinieren.

    
Xavier Ho 19.10.2011, 08:01
quelle
4

Sie können mit _id.getTime() (aus: ) nur den Zeitanteil der ID ermitteln Ссылка ). Das sollte über alle Shards sortierbar sein.

EDIT: Entschuldigung, das war die Java-Dokumentation ... Die JS-Version scheint _id.generation_time.in_time_zone (Time.zone) zu sein, von Ссылка

    
Chris Shain 17.10.2011 14:06
quelle
2

Ich habe eine vollständige Pymongo-basierte Lösung geschrieben, die inkrementelle Map-Reduce-Methoden verwendet, die Zeit zwischenspeichert und erwartet, dass sie in einem Cron-Job ausgeführt wird. Es sperrt sich selbst, so dass zwei nicht gleichzeitig ausgeführt werden können:

Ссылка

%Vor%     
Scott Stafford 29.06.2012 20:34
quelle
0

Wir lösen dieses Problem mit 'normalisierten' ObjectIds. Schritte, die wir machen:

  1. normalize id - nimm timestap von der aktuellen / gespeicherten / zuletzt bearbeiteten ID und setze andere Teile der ID zu ihren minimalen Werten. C # -Code: new ObjectId(objectId.Timestamp, 0, short.MinValue, 0)
  2. run map-reduce mit allen Items mit ID größer als unsere normalisierte ID, überspringen Sie bereits verarbeitete Artikel.
  3. speichert die zuletzt verarbeitete ID und markiert alle verarbeiteten Elemente.

Hinweis: Einige Randelemente werden mehrmals verarbeitet. Um es zu beheben, setzen wir eine Art Flag in den verarbeiteten Elementen.

    
user854301 19.08.2014 09:40
quelle

Tags und Links