2014-01-07 5 views
10

Ich möchte aggregieren und die Ergebnisse in eine vorhandene Sammlung einfügen, ohne diese Sammlung zu löschen. Die Dokumentation scheint zu zeigen, dass dies nicht direkt möglich ist. Ich finde das schwer zu glauben.Wie das Ergebnis in einer Sammlung aggregieren und zusammenführen?

Die Map-Reduce-Funktion hat 'Ausgabemodi', einschließlich 'merge', was mir gefällt. Ich suche nach dem Äquivalent für die Aggregation.

Die neue Aggregationsstufe $out unterstützt das Einfügen in eine Sammlung, ersetzt aber die Sammlung, anstatt sie zu aktualisieren. Wenn ich das täte, würde ich (glaube ich) eine andere Map-Reduce ausführen müssen, um diese in eine andere Sammlung zusammenzuführen, was ineffizient erscheint.

Fehle ich etwas oder fehlt nur die Funktion der Aggregationsfunktion?

Antwort

3

Das Lesen der documentation beantwortet diese Frage ziemlich genau. Atm Mongo ist nicht in der Lage zu tun, was Sie wollen.

Die $ out-Operation erstellt eine neue Sammlung in der aktuellen Datenbank, falls noch keine vorhanden ist. Die Sammlung ist erst sichtbar, wenn die Aggregation abgeschlossen ist. Wenn die Aggregation fehlschlägt, erstellt MongoDB die Auflistung nicht.

Wenn die durch den $ out-Vorgang angegebene Auflistung bereits vorhanden ist, ersetzt die $ out-Phase nach Abschluss der Aggregation automatisch die vorhandene Auflistung durch die neue Ergebnissammlung. Die $ out-Operation ändert keine Indizes, die in der vorherigen Sammlung vorhanden waren. Wenn die Aggregation fehlschlägt, nimmt die $ out-Operation keine Änderungen an der vorherigen Auflistung vor.

+0

Danke, habe ich die Seite (daher der Link in meiner Frage lesen) und beschrieb die Problemumgehung. Ich fragte, ob es einen anderen Mechanismus dafür gäbe. – Joe

+0

Wenn Sie direkt in der Shell arbeiten, können Sie etwas wie die hier beschriebene Lösung betrachten http://learnmongo.com/posts/easily-move-documents-between-collections-or-databases/ aber natürlich wird dies nicht auf der Serverseite ausgeführt werden, sondern erfordert das Abrufen und erneutes Einfügen der Daten – chk

+0

Danke, aber das würde dazu führen, Millionen von Datensätzen vor und zurück zu kopieren, die 16 MB weit übersteigt! – Joe

3

ich die Ausgabe von Aggregation verwendet, um die Sammlung einfügen/Merge:

db.coll2.insert(
     db.coll1.aggregate([]).toArray() 
    ) 
Verwandte Themen