A partire da Mongo 4.2
, il nuovo $merge
operatore di aggregazione (simile a $out
) consente la fusione il risultato di una pipeline di aggregazione nella raccolta specificata:
Dato questo input:
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 }
])
il $merge
la fase di aggregazione può essere utilizzata come tale:
db.source.aggregate([
// { $whatever aggregation stage, for this example, we just keep records as is }
{ $merge: { into: "target" } }
])
produrre:
// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }
Nota che il $merge
operatore viene fornito con molte opzioni
per specificare come unire i record inseriti in conflitto con i record esistenti.
In questo caso (con le opzioni di default), questo:
-
mantiene i documenti esistenti della collezione di destinazione (questo è il caso di
{ "_id": "id_2", "a": 54 }
) -
inserisce i documenti dall'output della pipeline di aggregazione nella raccolta di destinazione quando non sono già presenti (in base a
_id
- questo è il caso di{ "_id" : "id_3", "a" : 38 }
) -
sostituisce i record della raccolta di destinazione quando la pipeline di aggregazione produce documenti esistenti nella raccolta di destinazione (basati su
_id
- questo è il caso di{ "_id": "id_1", "a": 12 }
sostituito da{ "_id" : "id_1", "a" : 34 }
)