Definição
Observação
Esta página descreve o estágio $merge, que gera resultados do pipeline de agregação para uma coleção. Para o operador $mergeObjects, que mescla documentos em um único documento, consulte $mergeObjects.
$mergeGrava os resultados do pipeline de agregação para uma coleção especificada. O operador
$mergedeve ser o último estágio do pipeline.O estágio
$merge:Pode enviar para uma coleção no mesmo banco de dados ou em um banco de dados diferente.
Pode gerar saída para a mesma coleção que está sendo agregada. Para obter mais informações, consulte Saída para a mesma coleção que está sendo agregada.
Considere os seguintes pontos ao usar os estágios
$mergeou$outem um pipeline de agregação:A partir do MongoDB 5.0, os pipelines com um estágio
$mergepoderão ser executados em nós secundários do conjunto de réplicas se todos os nós do cluster tiverem o featureCompatibilityVersion definido como5.0ou superior e a preferência de leitura permitir leituras secundárias.nas versões anteriores do MongoDB , os pipelines com estágios
$outou$mergesempre são executados no nó principal, e a preferência de leitura não é considerada.
Cria uma nova coleta se a coleta de saída ainda não existir.
Pode incorporar resultados (inserir novos documentos, mesclar documentos, substituir documentos, manter documentos existentes, falhar a operação, processar documentos com um pipeline de atualização personalizado) a uma coleção existente.
Pode gerar saída para uma coleção fragmentada. A coleta de entrada também pode ser fragmentada.
Para uma comparação com o estágio
$out, que também gera os resultados da agregação em uma coleção, consulte$mergee$outComparação.
Observação
Visualizações materializadas sob demanda
$merge pode incorporar os resultados do pipeline em uma coleção de saída existente em vez de executar uma substituição completa da coleção. Essa funcionalidade permite que os usuários criem exibições materializadas sob demanda, em que o conteúdo da coleção de saída é atualizado de forma incremental quando o pipeline é executado.
Para obter mais informações sobre esse caso de uso, consulte Exibições materializadas sob demanda , bem como os exemplos nesta página.
As visualizações materializadas são separadas das exibições somente para leitura. Para obter informações sobre como criar visualizações somente para leitura, consulte exibições somente para leitura.
Compatibilidade
Você pode utilizar o $merge para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
$merge tem a seguinte sintaxe:
{ $merge: { into: <collection> -or- { db: <db>, coll: <collection> }, on: <identifier field> -or- [ <identifier field1>, ...], // Optional let: <variables>, // Optional whenMatched: <replace|keepExisting|merge|fail|pipeline>, // Optional whenNotMatched: <insert|discard|fail> // Optional } }
Por exemplo:
{ $merge: { into: "myOutput", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }
Se utilizar todas as opções padrão para $merge, inclusive gravar em uma coleção no mesmo banco de dados, você poderá utilizar o formulário simplificado:
{ $merge: <collection> } // Output collection is in the same database
O estágio $merge recebe um documento com os seguintes campos:
Campo | Descrição | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
A coleção de saída. Especifique uma das seguintes opções:
Se a coleção de saída não existir, o
A coleção de saída pode ser uma coleção fragmentada. | |||||||||||
Opcional. Campo ou campos que atuam como um identificador exclusivo para um documento. O identificador determina se um documento de resultados corresponde a um documento existente na coleta de resultados. Especifique uma das seguintes opções:
Para o campo ou campos especificados:
O valor padrão para ativado depende da coleta de saída:
| |||||||||||
Opcional. O comportamento de Você pode especificar:
| |||||||||||
Opcional. Especifica variáveis para uso no pipeline whenMatched. Especifique um documento com os nomes de variáveis e expressões de valor: Se não for especificado, Para acessar as variáveis no pipeline whenMatched: Especifique o prefixo do sinal de dólar duplo ($$) juntamente com o nome da variável no formulário Para obter exemplos, consulte Usar variáveis para personalizar a fusão. | |||||||||||
Opcional. O comportamento de Você pode especificar uma das strings de ação predefinidas:
|
Considerações
_id Geração de campo
Se o campo _id não estiver presente em um documento dos resultados do pipeline de agregação, o estágio $merge o gerará automaticamente.
Por exemplo, no seguinte pipeline de agregação, $project exclui o campo _id dos documentos passados para $merge. Quando $merge grava esses documentos para o "newCollection", $merge gera um novo campo _id e um novo valor.
db.movies.aggregate( [ { $project: { _id: 0 } }, { $merge : { into : "newCollection" } } ] )
Criar uma nova coleção se a coleta de saída não for existente
A operação $merge cria uma nova coleção se a coleção de saída especificada não existir.
A coleção de saída é criada quando
$mergegrava o primeiro documento na coleção e fica imediatamente visível.Se a agregação falhar, quaisquer gravações concluídas pelo
$mergeantes do erro não serão revertidas.
Observação
Para um conjunto de réplicas ou um standalone, se o banco de dados de saída não existir, $merge também criará o banco de dados.
Para um cluster fragmentado, o banco de dados de saída especificado já deve existir.
Se a coleção de saída não existir, $merge exige que o identificador ligado seja o campo _id. Para usar um valor de campo on diferente para uma coleção que não existe, você pode criar a coleção primeiro criando um índice exclusivo nos campos desejados. Por exemplo, se a coleção de saída newDailyCommentCount não existir e você quiser especificar o campo commentDate como o identificador ligado:
db.newDailyCommentCount.createIndex( { commentDate: 1 }, { unique: true } ) db.comments.aggregate( [ { $match: { date: { $gte: new Date("2002-01-01"), $lt: new Date("2002-02-01") } } }, { $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, count: { $sum: 1 } } }, { $project: { _id: 0, commentDate: { $toDate: "$_id" }, count: 1 } }, { $merge : { into : "newDailyCommentCount", on: "commentDate" } } ] )
Saída para uma coleção compartilhada
O estágio $merge pode gerar saída para uma coleção fragmentada. Quando a coleção de saída é fragmentada, $merge usa o campo _id e todos os campos da chave de shard com hash como identificador padrão. Se você substituir o padrão, o identificador ligado deverá incluir todos os campos de chave de shard com hash:
{ $merge: { into: "<shardedColl>" or { db:"<sharding enabled db>", coll: "<shardedColl>" }, on: [ "<shardkeyfield1>", "<shardkeyfield2>",... ], // Shard key fields and any additional fields let: <variables>, // Optional whenMatched: <replace|keepExisting|merge|fail|pipeline>, // Optional whenNotMatched: <insert|discard|fail> // Optional } }
Por exemplo, utilize o método sh.shardCollection() para criar uma nova coleção fragmentada moviesByYearAndRating com o campo rated como a chave fragmentada.
sh.shardCollection( "sample_mflix.moviesByYearAndRating", // Namespace of the collection to shard { rated: 1 }, // Shard key );
A coleção moviesByYearAndRating conterá documentos com estatísticas de filmes de acordo com o ano (campo year) e classificação de conteúdo (chave de shard com hash); especificamente, o identificador ligado é ["year", "rated"] (a ordem dos campos não importa). Como $merge exige um índice único com chaves que correspondem aos campos do identificador ligado, crie o índice único (a ordem dos campos não importa): [1]
db.moviesByYearAndRating.createIndex( { rated: 1, year: 1 }, { unique: true } )
Com a coleção fragmentada moviesByYearAndRating e o índice único criado, você pode usar $merge para gerar os resultados da agregação para essa coleção, correspondendo a [ "year", "rated" ], como neste exemplo:
db.movies.aggregate( [ { $match: { rated: { $ne: null }, year: { $ne: null } } }, { $group: { _id: { year: "$year", rated: "$rated" }, movieCount: { $sum: 1 } } }, { $project: { _id: 0, year: "$_id.year", rated: "$_id.rated", movieCount: 1 } }, { $merge: { into: "moviesByYearAndRating", "on": [ "year", "rated" ], whenMatched: "replace", whenNotMatched: "insert" } } ] )
| [1] | O método sh.shardCollection() também pode criar um índice exclusivo na chave de estilhaço quando a opção { unique: true
} for passada se: a chave de estilhaço for baseada em intervalo, a coleção estiver vazia e um índice exclusivo na chave de estilhaço ainda não existir. No exemplo anterior, como o identificador on é a chave de estilhaço e outro campo, uma operação separada para criar o índice correspondente é necessária. |
Substituir documentos ($merge) versus substituir coleção ($out)
$merge pode substituir um documento existente na coleção de saída se os resultados da agregação contiverem um documento ou documentos que correspondam com base na especificação ligada. Como tal, $merge pode substituir todos os documentos na coleção existente se os resultados da agregação incluírem documentos correspondentes para todos os documentos existentes na coleção e você especificar "substituir" para whenMatched.
No entanto, para substituir uma coleção existente, independentemente dos resultados da agregação, use $out em vez disso.
Documentos e _id existentes e valores da chave de fragmento
Os erros do $merge se o $merge resultar em uma alteração no valor de _id de um documento existente.
Dica
Para evitar esse erro, se o campo on não contiver o campo _id, remova o campo _id dos resultados da agregação para evitar o erro, como em um estágio $unset anterior e assim por diante.
Além disso, para uma coleção fragmentada, $merge também gera um erro se resultar em uma alteração no valor da chave fragmentada de um documento existente.
As gravações concluídas pelo $merge antes do erro não serão revertidas.
Restrições de índice único
Se o índice único usado por $merge para campo(s) ligado(s) for descartado no meio da agregação, não haverá garantias de que a agregação será eliminada. Se a agregação continuar, não haverá garantias de que os documentos não tenham valores de campo on duplicados.
Se o $merge tentar gravar um documento que viole qualquer índice exclusivo na coleção de saída, a operação gerará um erro. Por exemplo:
Insira um documento não correspondente que viole um índice exclusivo diferente do índice no(s) campo(s) em.
Falha se houver um documento correspondente na coleção. Especificamente, a operação tenta inserir o documento correspondente que viola o índice exclusivo no (s) campo (s) ativado(s).
Substituir um documento existente por um novo documento que viole um índice exclusivo que não seja o índice do(s) campo(s) ligado(s).
Mescle os documentos correspondentes que resultam em um documento que viola um índice exclusivo diferente do índice no(s) campo(s) ligado(s).
Validação de esquema
Se sua coleção usar validação de esquema e tiver validationAction definido como error, inserir um documento inválido ou atualizar um documento com valores inválidos com $merge gerará um MongoServerError e o documento não será gravado na coleção de destino. Se houver vários documentos inválidos, apenas o primeiro documento inválido encontrado gerará um erro. Todos os documentos válidos são gravados na coleção de destino e todos os documentos inválidos não são gravados.
whenMatched Comportamento de pipeline
Se todos os itens a seguir forem verdadeiros para um estágio $merge, $merge insere o documento diretamente na coleção de saída:
O valor de whenMatched é um pipeline de agregação,
O valor de whenNotMatched é
insert, eNão há correspondência para um documento na coleta de saída,
$merge insere o documento diretamente na coleta de saída.
$merge e $out comparação
Com a introdução de $merge, o MongoDB fornece dois estágios, $merge e $out, para gravar os resultados do pipeline de agregação em uma coleção:
$merge | |
|---|---|
|
|
|
|
|
|
|
|
|
|
Saída para a mesma coleção que está sendo agregada
Aviso
Quando $merge gera saídas para a mesma coleção que está sendo agregada, os documentos podem ser atualizados várias vezes ou a operação pode resultar em um loop infinito. Esse comportamento ocorre quando a atualização executada por $merge altera a localização física dos documentos armazenados no disco. Quando a localização física de um documento muda, $merge pode considerá-lo um documento totalmente novo, resultando em atualizações adicionais. Para obter mais informações sobre esse comportamento, consulte Problema de Halloween.
$merge pode gerar saída para a mesma coleção que está sendo agregada. Você também pode gerar saída para uma coleção que aparece em outros estágios do pipeline, como $lookup.
Restrições
Restrições | Descrição |
|---|---|
Um pipeline de agregação não pode usar | |
Um pipeline de agregação não pode usar | |
Separate from materialized view | Uma definição de visualização não pode incluir o estágio |
| O |
| O |
| O |
| O estágio |
Exemplos
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Visualização materializada sob demanda: criação inicial
Se a coleção de saída não existir, o $merge criará a coleção.
Observação
Para um conjunto de réplicas ou uma implantação autônoma, se o banco de dados de saída não existir, $merge também criará o banco de dados.
Para uma implantação de cluster fragmentado, o banco de dados de saída especificado já deve existir.
Você pode usar os $group e $merge estágios para criar uma coleção movieRatingSummary que resume filmes aclamados pela crítica por ano de lançamento e classificação de conteúdo:
db.movies.aggregate( [ { $match: { metacritic: 100, rated: { $ne: null }, year: { $lte: 1972 } } }, { $group: { _id: { year: "$year", rated: "$rated" }, count: { $sum: 1 } } }, { $merge : { into: "movieRatingSummary", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } } ] )
O pipeline usa as seguintes etapas:
$matchestágio para filtrar filmes aclamados pela crítica lançados por meio de 1972 com uma classificação de conteúdoEstágio
$grouppara agrupar os filmes poryearerated$mergeestágio para gravar a saída do estágio$groupprecedente na coleçãomovieRatingSummaryno banco de dadossample_mflix
Para visualizar os documentos na nova coleção movieRatingSummary:
db.movieRatingSummary.find().sort( { _id: 1 } )
[ { _id: { year: 1939, rated: 'PASSED' }, count: 1 }, { _id: { year: 1962, rated: 'PG' }, count: 1 }, { _id: { year: 1963, rated: 'PG' }, count: 1 }, { _id: { year: 1970, rated: 'R' }, count: 1 }, { _id: { year: 1972, rated: 'R' }, count: 1 } ]
Visualização materializada sob demanda: atualizar/substituir dados
Para atualizar a coleção de movieRatingSummary do exemplo anterior para incluir filmes aclamados pela crítica a partir de 1963, este pipeline de agregação utiliza os seguintes estágios:
Estágio
$matchpara encontrar todos os filmes commetacritic: 100, uma classificação de conteúdo e um ano de lançamento maior ou igual a1963.$groupestágio para agrupar os filmes poryearerated.$mergepara gravar o conjunto de resultados na coleçãomovieRatingSummary, substituindo documentos com o mesmo valor de_id. Para documentos que não têm correspondências na coleção, o$mergeinsere os novos documentos.
db.movies.aggregate( [ { $match: { metacritic: 100, rated: { $ne: null }, year: { $gte: 1963 } } }, { $group: { _id: { year: "$year", rated: "$rated" }, count: { $sum: 1 } } }, { $merge : { into: "movieRatingSummary", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } } ] )
Após a execução da agregação, exiba os documentos na coleção movieRatingSummary:
db.movieRatingSummary.find().sort( { _id: 1 } )
[ { _id: { year: 1939, rated: 'PASSED' }, count: 1 }, { _id: { year: 1962, rated: 'PG' }, count: 1 }, { _id: { year: 1963, rated: 'PG' }, count: 1 }, { _id: { year: 1970, rated: 'R' }, count: 1 }, { _id: { year: 1972, rated: 'R' }, count: 1 }, { _id: { year: 1982, rated: 'R' }, count: 1 }, { _id: { year: 2014, rated: 'R' }, count: 1 } ]
Insira apenas novos dados
Para garantir que o $merge não substitua os dados existentes na coleção, configure whenMatched para keepExisting ou fail.
Uma coleção movieArchive no banco de dados sample_mflix contém registros históricos de filmes aclamados pela crítica de acordo com o ano de lançamento.
A coleção movieArchive tem um índice único no campo year. No máximo, deve existir um registro por ano de lançamento:
db.movieArchive.createIndex( { year: 1 }, { unique: true } )
Este pipeline de agregação atualiza a coleção movieArchive com dados da coleção movies para incluir filmes aclamados pela crítica a partir de 1963. O pipeline usa os seguintes estágios:
Estágio
$matchpara encontrar todos os filmes commetacritic: 100, uma classificação de conteúdo eyear >= 1963.$grouppara agrupar os títulos dos filmes poryear.Estágio
$projectpara suprimir o campo_ide promoveryeara um campo de nível superior. Quando os documentos são passados para$merge,$mergegera automaticamente um novo campo_idpara os documentos.$mergepara gravar o conjunto de resultados emmovieArchive.O estágio
$mergefaz a correspondência dos documentos no campoyeare falha quando houver correspondência. Ou seja, se já existir um documento para esse ano de lançamento, o$mergeapresenta erro.
db.movies.aggregate( [ { $match: { metacritic: 100, rated: { $ne: null }, year: { $gte: 1963 } } }, { $group: { _id: "$year", titles: { $push: "$title" } } }, { $project: { _id: 0, year: "$_id", titles: 1 } }, { $merge : { into: "movieArchive", on: "year", whenMatched: "fail" } } ] )
Se a coleção movieArchive já contiver um documento de qualquer ano na faixa 1963–2014, a agregação falhará devido ao erro de chave duplicada. No entanto, o pipeline não reverte nenhum documento inserido antes do erro.
Se você especificar keepExisting para o documento correspondente, a agregação não afetará o documento correspondente e não apresentará erro com erro de chave duplicada. Da mesma forma, se você especificar substituir, a operação não falhará; no entanto, a operação substituirá o documento existente.
Mesclar resultados de múltiplas coleções
Por padrão, se um documento nos resultados de agregação corresponder a um documento na coleção, o estágio $merge mescla os documentos.
Você pode usar $merge para mesclar os resultados da coleção movies e da coleção comments para criar uma nova coleção yearlyStats.
Para criar a coleção yearlyStats, execute o seguinte pipeline:
db.movies.aggregate( [ { $match: { metacritic: 100, rated: { $ne: null }, year: { $gte: 1970, $lte: 1972 } } }, { $group: { _id: "$year", movieCount: { $sum: 1 } } }, { $merge : { into: "yearlyStats", on: "_id", whenMatched: "merge", whenNotMatched: "insert" } } ])
- Primeiro estágio:
- Os filtros do estágio
$matchpara filmes aclamados pela crítica (metacritic: 100) com classificação indicativa, lançados entre 1970 e 1972. - Segundo estágio:
- O estágio
$groupagrupa poryeare conta filmes em um novo campomovieCount. - Terceiro estágio:
- O estágio
$mergegrava os documentos na coleçãoyearlyStatsno mesmo banco de dados. Se o estágio encontrar um documento existente na coleção que corresponda ao campo_id, o estágio mesclará os documentos correspondentes. Caso contrário, o estágio insere o documento. Para a criação inicial, nenhum documento corresponde.
Para visualizar os documentos na coleção, execute a seguinte operação:
db.yearlyStats.find().sort( { _id: 1 } )
[ { _id: 1970, movieCount: 1 }, { _id: 1972, movieCount: 1 } ]
Da mesma forma, execute o seguinte pipeline de agregação na coleção comments para mesclar as contagens de comentários na coleção yearlyStats.
db.comments.aggregate( [ { $match: { date: { $gte: new Date("1970-01-01"), $lt: new Date("1973-01-01") } } }, { $group: { _id: { $year: "$date" }, commentCount: { $sum: 1 } } }, { $merge : { into: "yearlyStats", on: "_id", whenMatched: "merge", whenNotMatched: "insert" } } ])
- Primeiro estágio:
- O estágio
$matchfiltra para comentários postados entre 1970 e 1972. - Segundo estágio:
- O estágio
$groupagrupa por ano extraído do comentáriodatee conta comentários em um novo campocommentCount. - Terceiro estágio:
- O estágio
$mergegrava os documentos na coleçãoyearlyStatsno mesmo banco de dados. Se o estágio encontrar um documento existente na coleção que corresponda ao campo_id(o ano), o estágio mesclará os documentos correspondentes. Caso contrário, o estágio insere o documento.
Para visualizar os documentos na coleção yearlyStats após os dados terem sido mesclados, execute a seguinte operação:
db.yearlyStats.find().sort( { _id: 1 } )
[ { _id: 1970, movieCount: 1, commentCount: 889 }, { _id: 1971, commentCount: 825 }, { _id: 1972, movieCount: 1, commentCount: 863 } ]
Use o pipeline para personalizar a fusão
O $merge pode usar um pipeline de atualização personalizado quando os documentos correspondem. O pipeline whenMatched pode ter os seguintes estágios:
$addFieldse seu alias$set$replaceRoote seu alias$replaceWith
Uma coleção monthlyCommentTotals acompanha a contagem contínua de comentários para cada mês.
Todos os dias, novos comentários chegam à coleção sample_mflix.comments. O pipeline de agregação a seguir atualiza o total mensal com a contagem de comentários desse dia:
db.comments.aggregate([ { $match: { date: { $gte: new Date("1970-01-15"), $lt: new Date("1970-01-16") } } }, { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$date" } }, count: { $sum: 1 } } }, { $merge: { into: "monthlyCommentTotals", on: "_id", whenMatched: [ { $addFields: { count: { $add: [ "$count", "$$new.count" ] } } } ], whenNotMatched: "insert" } } ])
- Primeiro estágio:
- O estágio
$matchencontra todos os comentários postados em janeiro 15, 1970. - Segundo estágio:
- O estágio
$groupagrupa os comentários por ano-mês e os conta. - Terceiro estágio:
O estágio
$mergegrava os documentos na coleçãomonthlyCommentTotals. Se o estágio encontrar um documento existente na coleção que corresponda ao campo_id, o estágio usa um pipeline para adicionar ocountdo dia ao total mensal existente.Esse pipeline não pode acessar diretamente os campos do documento de resultados. Para acessar o campo
countno documento de resultados, o pipeline usa a variável$$new; ou seja,$$new.count.Esse pipeline pode acessar diretamente o campo
countno documento existente na coleção; ou seja,$count.
O documento resultante substitui o documento existente.
Para visualizar documentos na coleção monthlyCommentTotals após a operação de mesclagem, execute a seguinte operação:
db.monthlyCommentTotals.find()
[ { _id: '1970-01', count: 71 } ]
Usar variáveis para personalizar a fusão
Você pode usar variáveis no campo whenMatched do estágio $merge. As variáveis precisam ser definidas para poderem ser usadas.
Defina variáveis em uma ou em ambas as opções a seguir:
Para usar variáveis em whenMatched:
Especifique o prefixo do sinal de dólar duplo ($$) juntamente com o nome da variável no formulário $$<variable_name>. Por exemplo, $$year. Se a variável estiver definida para um documento, você também poderá incluir um campo de documento no formulário $$<variable_name>.<field>. Por exemplo, $$year.month.
As guias abaixo demonstram o comportamento quando as variáveis são definidas no estágio de mesclagem, no comando de agregação ou em ambos.
Usar variáveis definidas no estágio de mesclagem
Você pode definir variáveis no estágio $merge let e usar as variáveis no campo whenMatched.
O seguinte exemplo:
semeia uma coleção
movieDetailscom um filme da coleçãomoviesexecuta um comando
aggregateque define uma variávelyearno$mergelet e adiciona o ano amovieDetailsusando WhenMatchedretrieves the
movieDetailsdocument
db.movies.aggregate( [ { $match: { title: "The Godfather" } }, { $limit: 1 }, { $project: { title: 1 } }, { $merge: { into: "movieDetails", whenNotMatched: "insert" } } ] ) db.runCommand( { aggregate: db.movieDetails.getName(), pipeline: [ { $merge: { into: db.movieDetails.getName(), let : { year: "2023" }, whenMatched: [ { $addFields: { "addedYear": "$$year" } } ] } } ], cursor: {} } ) db.movieDetails.find()
[ { _id: ..., title: 'The Godfather', addedYear: '2023' } ]
Usar variáveis definidas no comando de agregação
Novidades na versão 5.0.
Você pode definir variáveis no comando aggregate let e usar as variáveis no campo whenMatched do estágio $merge.
O seguinte exemplo:
semeia uma coleção
movieDetailscom um filme da coleçãomoviesexecuta um comando
aggregateque define uma variávelyearno comandoaggregatelet e adiciona o ano amovieDetailsusando WhenMatchedretrieves the
movieDetailsdocument
db.movies.aggregate( [ { $match: { title: "The Godfather" } }, { $limit: 1 }, { $project: { title: 1 } }, { $merge: { into: "movieDetails", whenNotMatched: "insert" } } ] ) db.runCommand( { aggregate: db.movieDetails.getName(), pipeline: [ { $merge: { into: db.movieDetails.getName(), whenMatched: [ { $addFields: { "addedYear": "$$year" } } ] } } ], cursor: {}, let : { year: "2023" } } ) db.movieDetails.find()
[ { _id: ..., title: 'The Godfather', addedYear: '2023' } ]
Usar variáveis definidas no estágio de mesclagem e comando de agregação
Você pode definir variáveis no estágio $merge e, a partir do MongoDB 5.0, no comando aggregate.
Se duas variáveis com o mesmo nome forem definidas no estágio $merge e no comando aggregate, a variável de estágio $merge será usada.
Neste exemplo, o pipeline usa year: "2023" em vez da variável de comando year: "2019" aggregate:
db.movies.aggregate( [ { $match: { title: "The Godfather" } }, { $limit: 1 }, { $project: { title: 1 } }, { $merge: { into: "movieDetails", whenNotMatched: "insert" } } ] ) db.runCommand( { aggregate: db.movieDetails.getName(), pipeline: [ { $merge: { into: db.movieDetails.getName(), let : { year: "2023" }, whenMatched: [ { $addFields: { "addedYear": "$$year" } } ] } } ], cursor: {}, let : { year: "2019" } } ) db.movieDetails.find()
[ { _id: ..., title: 'The Godfather', addedYear: '2023' } ]
A classe Movie a seguir modela os documentos usados neste exemplo:
[] public class Movie { [] public ObjectId Id { get; set; } [] public string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
Para usar o driver MongoDB .NET/C# para adicionar um estágio $merge a um pipeline de agregação, chame o método Merge() em um objeto PipelineDefinition.
Ao chamar o Merge() método, você deve passar uma instância da classe MergeStageOptions . Este objeto permite especificar opções para o estágio $merge, como lidar com documentos correspondentes.
O exemplo a seguir cria um estágio de pipeline que mescla os documentos no pipeline na coleção movies. O objeto MergeStageOptions especifica as seguintes opções:
A opção
OnFieldNamesespecifica que a operação deve usar o campo"_id"para identificar documentos correspondentes.A opção
WhenMatchedespecifica que, se um documento na coleção de origem corresponder a um documento na coleção de destino, a operação substituirá o documento correspondente.A opção
WhenNotMatchedespecifica que, se um documento na coleção de origem não corresponder a um documento na coleção de destino, a operação inserirá o documento na coleção de destino.
var pipeline = new EmptyPipelineDefinition<Movie>() .Merge(_targetCollection, new MergeStageOptions<Movie>() { OnFieldNames = new List<string>() { "_id" }, WhenMatched = MergeStageWhenMatched.Replace, WhenNotMatched = MergeStageWhenNotMatched.Insert, });
{ "_id": "...", "title": "Back to the Future", "metacritic": 96 } { "_id": "...", "title": "Jurassic Park", "metacritic": 68 } { "_id": "...", "title": "The Shawshank Redemption", "metacritic": 80 }
Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js
Para usar o driver Node.js do MongoDB para adicionar um estágio $merge a um pipeline de agregação , use o operador $merge em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que mescla os documentos no pipeline na coleção movies. O exemplo inclui os seguintes campos:
A opção
onespecifica que a operação deve usar os campos"_id"e"title"para localizar documentos correspondentes na coleção de origem e na coleçãomovies.A opção
whenMatchedespecifica que, se um documento na coleção de origem corresponder a um documento na coleçãomovies, ele substituirá o documento na coleçãomovies.A opção
whenNotMatchedespecifica que, se um documento na collection de origem não corresponder a um documento na collectionmovies, a operação inserirá o documento na collectionmovies.
Em seguida, o exemplo executa o agregação pipeline:
const pipeline = [ { $merge: { into: "movies", on: ["_id", "title"], whenMatched: "replace", whenNotMatched: "insert" } } ]; const cursor = collection.aggregate(pipeline); return cursor;