MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como faço para anexar resultados de agregação do Mongo DB a uma coleção existente?


Iniciando o Mongo 4.2 , o novo $merge operador de agregação (semelhante a $out ) permite mesclar o resultado de um pipeline de agregação na coleção especificada:

Dada esta entrada:
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 }
])

o $merge estágio de agregação pode ser usado como tal:
db.source.aggregate([
  // { $whatever aggregation stage, for this example, we just keep records as is }
  { $merge: { into: "target" } }
])

para produzir:
// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }

Observe que o $merge operador vem com muitas opções para especificar como mesclar registros inseridos em conflito com registros existentes.

Neste caso (com as opções padrão), isto:

  • mantém os documentos existentes da coleção de destino (este é o caso de { "_id": "id_2", "a": 54 } )

  • insere documentos da saída do pipeline de agregação na coleção de destino quando eles ainda não estiverem presentes (com base no _id - este é o caso de { "_id" : "id_3", "a" : 38 } )

  • substitui os registros da coleção de destino quando o pipeline de agregação produz documentos existentes na coleção de destino (com base no _id - este é o caso de { "_id": "id_1", "a": 12 } substituído por { "_id" : "id_1", "a" : 34 } )