$merge
Nesta página
$merge
grava os resultados de umpipeline de agregação do em uma coleção temporária no Atlas cluster. O Atlas Data Federation então executa o $merge
localmente no Atlas cluster para juntar dados em blocos na coleção de destino. No evento de uma falha durante uma operação $merge
, isso garante que pelo menos dados parciais sejam gravados na coleção de destino.
No Atlas Data Federation, o $merge
pode:
Escreva dados de qualquer um dos armazenamentos de instância do banco de dados federado suportados .
Gravar no mesmo cluster, banco de dados ou coleção do Atlas ou em um cluster diferente dentro do mesmo projeto do Atlas.
Para permitir gravações em um Atlas cluster, o Atlas Data Federation introduz uma sintaxe alternativa para o campo into
obrigatório. O Atlas Data Federation é compatível com todos os outros campos, conforme descrito em $merge
.
Para saber mais, consulte o estágio do pipeline do $merge
.
Permissões necessárias
Para usar $merge
para escrever em uma collection no Atlas cluster, você deve ser um utilizador de banco de dados com os seguintes privilégios:
Considerações
Se a agregação falhar, o Atlas Data Federation não reverterá as gravações de que o $merge
concluído antes da ocorrência do erro.
Sintaxe
{ "$merge": { "into": { "atlas": { "projectId": "<atlas-project-ID>", "clusterName": "<atlas-cluster-name>", "db": "<atlas-database-name>", "coll": "<atlas-collection-name>" } }, "on": "<identifier field>"|[ "<identifier field1>", ...], "let": { <variables> }, "whenMatched": "replace|keepExisting|merge|fail|pipeline", "whenNotMatched": "insert|discard|fail" } }
Campos
Esta seção descreve a sintaxe alternativa que o Atlas Data Federation fornece para o campo into
.
Campo | Tipo | Descrição | necessidade |
---|---|---|---|
| objeto | Local para gravar os documentos a partir da aggregation pipeline. | Obrigatório |
| string | Nome do Atlas cluster. | Obrigatório |
| string | Nome da coleção no Atlas cluster. | Obrigatório |
| string | Nome do banco de dados no Atlas cluster que contém a coleção. | Obrigatório |
| string | Identificador único do projeto que contém o Atlas cluster. Este é o ID do projeto que contém sua instância do banco de dados federado. Se omitido, padroniza para o ID do projeto que contém sua instância do banco de dados federado. | Opcional |
Para saber mais sobre os outros campos, on
, let
, whenMatched
e whenNotMatched
, consulte a documentação do servidor MongoDB para $merge
.
Observação
Para usar on
em vários campos, você deve criar um índice único composto nos campos de identificador ''on''.
Opções
Opção | Tipo | Descrição | necessidade | |
---|---|---|---|---|
| booleano | Sinalize para executar operações de aggregation em segundo plano. Se omitido, o padrão será
Use essa opção para enviar novas queries sem ter que aguardar queries em execução concluírem ou desconectarem sua conexão de instância do banco de dados federado enquanto as queries continuam sendo executadas em segundo plano. | Opcional |
Resolvendo IDs de documentos duplicados
Ao gravar documentos de seu arquivo ou de seus armazenamentos de dados em seu Atlas cluster, seus documentos podem ter campos _id
duplicados. Esta seção descreve como o Atlas Data Federation resolve duplicatas e inclui recomendações para resolver duplicatas em seu pipeline de agregação.
Resolvendo IDs duplicados no Atlas Data Federation
Para resolver duplicatas, o Atlas Data Federation:
Escreve documentos para uma coleção Atlas
X
na ordem em que recebe os documentos até encontrar uma duplicata.Escreve o documento com o campo
_id
duplicado e todos os documentos subsequentes para uma nova coleção AtlasY
.Executa o estágio
$merge
especificado para mesclar a coleçãoY
na coleçãoX
.Escreve os documentos resultantes na coleção de destino no cluster de Atlas especificado.
Observação
O Atlas Data Federation resolve apenas valores duplicados no campo _id
. Não resolve valores duplicados em outros campos com índice único.
Corrigindo IDs duplicados
Para corrigir campos _id
duplicados, você pode:
Inclua um estágio do
$sort
no seu pipeline para especificar a ordem na qual o Atlas Data Federation deve processar os documentos resultantes.Com base na ordem de documentos fluindo para a etapa
$merge
, escolha o valor para as opçõeswhenMatched
ewhenNotMatched
da etapa$merge
cuidadosamente.Exemplo
Os exemplos seguintes mostram como o Atlas Data Federation resolve duplicatas durante o estágio
$merge
quando a opçãowhenMatched
está configurada parakeepExisting
oureplace
. Esses exemplos usam os seguintes documentos:{ "_id" : 1, "state" : "FL" }, { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Suponha que você execute o seguinte pipeline nos documentos listados acima:
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ]) O Atlas Data Federation grava os seguintes dados em duas coleções denominadas
X
eY
:{ "_id" : 1, "state" : "FL" } { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } O Atlas Data Federation une documentos de coleção
Y
a coleçãoX
. Para a opçãowhenMatched: keepExisting
no pipeline, o Atlas Data Federation mantém o documento existente com_id: 1
na coleçãoX
. Portanto, o resultado do pipeline com duplicatas contém os seguintes documentos:{ "_id" : 1, "state" : "FL" }, { "_id" : 2, "state" : "TX" } Em seguida, o Atlas Data Federation mescla esses documentos na coleção de destino no Atlas cluster especificado.
Suponha que você execute o seguinte pipeline nos documentos listados acima:
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "insert" } } ]) O Atlas Data Federation grava os seguintes dados em duas coleções denominadas
X
eY
:{ "_id" : 1, "state" : "FL" } { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } O Atlas Data Federation mescla documentos da coleta
Y
à coletaX
. Para a opçãowhenMatched: replace
no pipeline, o Atlas Data Federation substitui o documento pelo_id: 1
na coleçãoX
pelo documento pelo_id: 1
na coleçãoY
. Portanto, o resultado do pipeline com duplicatas contém os seguintes documentos:{ "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Em seguida, o Atlas Data Federation mescla esses documentos na coleção de destino no Atlas cluster especificado.
Evite usar a opção
whenNotMatched: discard
.Exemplo
Este exemplo mostra como o Atlas Data Federation resolve as duplicatas quando a opção
whenNotMatched
é definida comodiscard
usando os seguintes documentos:{ "_id" : 1, "state" : "AZ" }, { "_id" : 1, "state" : "CA" }, { "_id" : 2, "state" : "NJ" }, { "_id" : 3, "state" : "NY" }, { "_id" : 4, "state" : "TX" } Suponha que você execute o seguinte pipeline nos documentos listados acima:
db.archivecoll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "discard" } } ]) O Atlas Data Federation grava os seguintes dados em duas coleções denominadas
X
eY
:{ "_id" : 1, "state" : "AZ" // gets replaced } { "_id" : 1, "state" : "CA" } { "_id" : 2, "state" : "NJ" // gets discarded } { "_id" : 3, "state" : "NY" // gets discarded } { "_id" : 4, "state" : "TX" // gets discarded } O Atlas Data Federation mescla documentos da coleta
Y
à coletaX
. Para a opçãowhenMatched: replace
no pipeline, o Atlas Data Federation substitui o documento pelo_id: 1
na coleçãoX
pelo documento pelo_id: 1
na coleçãoY
. Para a opçãowhenNotMatched: discard
no pipeline, o Atlas Data Federation descarta documentos na coleçãoY
que não correspondem a um documento na coleçãoX
. Portanto, o resultado do pipeline com duplicatas contém apenas o seguinte documento:{ "_id" : 1, "state" : "CA" } O Atlas Data Federation então mescla este documento na coleta de destino no cluster de Atlas especificado.
Exemplo
Mesclar dados usando $merge
O exemplo $merge
sintaxe a seguir grava os resultados em uma coleção sampleDB.mySampleData
no Atlas cluster chamada myTestCluster
. O exemplo não especifica uma ID do projeto; o estágio $merge
usa a ID do projeto que contém sua instância do banco de dados federado.
Exemplo
1 db.mySampleData.aggregate( 2 [ 3 { 4 "$merge": { 5 "into": { 6 "atlas": { 7 "clusterName": "myTestCluster", 8 "db": "sampleDB", 9 "coll": "mySampleData" 10 } 11 }, 12 ... 13 } 14 } 15 ] 16 )
Executar $merge
em segundo plano
A sintaxe $merge
do exemplo a seguir grava os resultados em uma coleção sampleDB.mySampleData
no Atlas cluster chamada myTestCluster
em segundo plano. O exemplo não especifica uma ID do projeto; o estágio $merge
usa a ID do projeto que contém sua instância do banco de dados federado.
Exemplo
1 db.mySampleData.aggregate( 2 [ 3 { 4 "$merge": { 5 "into": { 6 "atlas": { 7 "clusterName": "myTestCluster", 8 "db": "sampleDB", 9 "coll": "mySampleData" 10 } 11 }, 12 ... 13 } 14 } 15 ], 16 { "background" : true } 17 )