Démarrage de Mongo 4.2
, le nouveau $merge
opérateur d'agrégation (similaire à $out
) permet la fusion le résultat d'un pipeline d'agrégation dans la collection spécifiée :
Étant donné cette entrée :
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 }
])
le $merge
l'étape d'agrégation peut être utilisée comme telle :
db.source.aggregate([
// { $whatever aggregation stage, for this example, we just keep records as is }
{ $merge: { into: "target" } }
])
produire :
// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }
Notez que le $merge
L'opérateur est livré avec de nombreuses options
pour spécifier comment fusionner les enregistrements insérés en conflit avec les enregistrements existants.
Dans ce cas (avec les options par défaut), ceci :
-
conserve les documents existants de la collection cible (c'est le cas de
{ "_id": "id_2", "a": 54 }
) -
insère des documents de la sortie du pipeline d'agrégation dans la collection cible lorsqu'ils ne sont pas déjà présents (basé sur le
_id
- c'est le cas de{ "_id" : "id_3", "a" : 38 }
) -
remplace les enregistrements de la collection cible lorsque le pipeline d'agrégation produit des documents existant dans la collection cible (basé sur le
_id
- c'est le cas de{ "_id": "id_1", "a": 12 }
remplacé par{ "_id" : "id_1", "a" : 34 }
)