Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / /

$merge

Nesta página

  • Permissões necessárias
  • Considerações
  • Sintaxe
  • Campos
  • Opções
  • Resolvendo IDs de documentos duplicados
  • Resolvendo IDs duplicados no Atlas Data Federation
  • Corrigindo IDs duplicados
  • Exemplo
  • Mesclar dados usando $merge
  • Executar $merge em segundo plano

$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 .

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:

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.

{
"$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"
}
}

Esta seção descreve a sintaxe alternativa que o Atlas Data Federation fornece para o campo into.

Campo
Tipo
Descrição
necessidade

atlas

objeto

Local para gravar os documentos a partir da aggregation pipeline.

Obrigatório

clusterName

string

Nome do Atlas cluster.

Obrigatório

coll

string

Nome da coleção no Atlas cluster.

Obrigatório

db

string

Nome do banco de dados no Atlas cluster que contém a coleção.

Obrigatório

projectId

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ção
Tipo
Descrição
necessidade

background

booleano

Sinalize para executar operações de aggregation em segundo plano. Se omitido, o padrão será false. Quando configurado para true, o Atlas Data Federation executa as queries em segundo plano.

{ "background" : true }

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

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.

Para resolver duplicatas, o Atlas Data Federation:

  1. Escreve documentos para uma coleção Atlas X na ordem em que recebe os documentos até encontrar uma duplicata.

  2. Escreve o documento com o campo _id duplicado e todos os documentos subsequentes para uma nova coleção Atlas Y.

  3. Executa o estágio $merge especificado para mesclar a coleção Y na coleção X.

  4. 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.

Para corrigir campos _id duplicados, você pode:

  1. Inclua um estágio do $sort no seu pipeline para especificar a ordem na qual o Atlas Data Federation deve processar os documentos resultantes.

  2. Com base na ordem de documentos fluindo para a etapa $merge , escolha o valor para as opções whenMatched e whenNotMatched da etapa $merge cuidadosamente.

    Exemplo

    Os exemplos seguintes mostram como o Atlas Data Federation resolve duplicatas durante o estágio $merge quando a opção whenMatched está configurada para keepExisting ou replace. 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 e Y:

    {
    "_id" : 1,
    "state" : "FL"
    }
    {
    "_id" : 1,
    "state" : "NJ"
    },
    {
    "_id" : 2,
    "state" : "TX"
    }

    O Atlas Data Federation une documentos de coleção Y a coleção X. Para a opção whenMatched: keepExisting no pipeline, o Atlas Data Federation mantém o documento existente com _id: 1 na coleção X. 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 e Y:

    {
    "_id" : 1,
    "state" : "FL"
    }
    {
    "_id" : 1,
    "state" : "NJ"
    },
    {
    "_id" : 2,
    "state" : "TX"
    }

    O Atlas Data Federation mescla documentos da coleta Y à coleta X. Para a opção whenMatched: replace no pipeline, o Atlas Data Federation substitui o documento pelo _id: 1 na coleção X pelo documento pelo _id: 1 na coleção Y. 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.

  3. 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 como discard 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 e Y:

    {
    "_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 à coleta X. Para a opção whenMatched: replace no pipeline, o Atlas Data Federation substitui o documento pelo _id: 1 na coleção X pelo documento pelo _id: 1 na coleção Y. Para a opção whenNotMatched: discard no pipeline, o Atlas Data Federation descarta documentos na coleção Y que não correspondem a um documento na coleção X. 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.

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

1db.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)

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

1db.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)

Voltar

$lookup