MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come posso aggiungere i risultati dell'aggregazione di Mongo DB a una raccolta esistente?

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