MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment ajouter les résultats d'agrégation Mongo DB à une collection existante ?

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 } )