MongoDB w wersji 4.2 udostępnił nowy etap potoku agregacji (ang. aggregation pipeline) - $merge.
Pozwala on na zapisanie wyniku agregacji do określonej kolekcji.
Etap $merge:
Może wyprowadzać dane do kolekcji w tej samej lub innej bazie danych,
utworzyć nową kolekcję, jeśli kolekcja jeszcze nie istnieje,
Etap $merge zawsze musi być ostatnim etapem agregacji. Możemy określić następujące parametry:
into - kolekcja, do której chcemy zapisać wynik; może to być kolekcja w innej bazie np.: into: { db:"myDB", coll:"myOutput" },
on - pole lub pola, które działają jako unikalny identyfikator dokumentu. Identyfikator określa, czy dokument wynikowy pasuje do istniejącego dokumentu w kolekcji wyjściowej. Domyślnie _id, jeśli wskażemy inne pola, to musi być na nich unikalny indeks,
let - zmienne wykorzystywane w whenMatched,
whenMatched - rodzaj zachowania, gdy w kolekcji wyjściowej znajduje się taki sam dokument (dopasowany po on),
whenNotMatched - rodzaj zachowania, gdy w kolekcji wyjściowej nie znaleziono dokumentu o takim samym identyfikatorze.
Dzięki $merge możemy tworzyć zmaterializowane widoki na żądanie (ang. On-Demand Materialized View). Ciekawy przykład wprost z dokumentacji MongoDB:
Potrzebujemy jednak raportu, który przedstawi nam sumaryczną sprzedaż i kupno dla poszczególnych kwartałów. Dane te będą nam często potrzebne, więc dobrze będzie je zapisać. Wykorzystamy do tego operator $merge.
W wyniku otrzymujemy kolekcję, która służy nam za widok ze zagregowanymi danymi. Warto zauważyć, że w wynikowej kolekcji dokumenty zostały zmergowane, a nie zastąpione: