Uruchamianie Mongo 4.2
, nowy $merge
operator agregacji (podobny do $out
) umożliwia scalanie wynik potoku agregacji do określonej kolekcji:
Biorąc pod uwagę te dane wejściowe:
db.source.insert([
{ "_id": "id_1", "a": 34 },
{ "_id": "id_3", "a": 38 },
{ "_id": "id_4", "a": 54 }
])
db.target.insert([
{ "_id": "id_1", "a": 12 },
{ "_id": "id_2", "a": 54 }
])
$merge
etap agregacji może być użyty w następujący sposób:
db.source.aggregate([
// { $whatever aggregation stage, for this example, we just keep records as is }
{ $merge: { into: "target" } }
])
do produkcji:
// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }
Zauważ, że $merge
operator ma wiele opcji
aby określić, jak scalić wstawione rekordy sprzeczne z istniejącymi rekordami.
W tym przypadku (z domyślnymi opcjami):
-
zachowuje istniejące dokumenty kolekcji docelowej (tak jest w przypadku
{ "_id": "id_2", "a": 54 }
) -
wstawia dokumenty z wyjścia potoku agregacji do kolekcji docelowej, gdy jeszcze ich nie ma (na podstawie
_id
- tak jest w przypadku{ "_id" : "id_3", "a" : 38 }
) -
zastępuje rekordy kolekcji docelowej, gdy potok agregacji tworzy dokumenty istniejące w kolekcji docelowej (na podstawie
_id
- tak jest w przypadku{ "_id": "id_1", "a": 12 }
zastąpione przez{ "_id" : "id_1", "a" : 34 }
)