Definição
updateO comando
updatemodifica documentos em uma coleção. Um único comandoupdatepode conter vÔrias declarações de atualização.Dica
No
mongosh, este comando também pode ser executado através dos métodos assistenteupdateOne(),updateMany(),replaceOne(),findOneAndReplace()efindOneAndUpdate().Os métodos auxiliares são prÔticos para os usuÔrios
mongosh, mas podem nĆ£o retornar o mesmo nĆvel de informaƧƵes que os comandos do banco de dados. Nos casos em que a praticidade nĆ£o for necessĆ”ria ou os campos de retorno adicionais forem necessĆ”rios, use o comando de banco de dados.
Compatibilidade
Esse comando estĆ” disponĆvel em implantaƧƵes hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviƧo totalmente gerenciado para implantaƧƵes do MongoDB na nuvem
Observação
Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas a todos os comandos, consulte Comandos não suportados.
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
Alterado na versão 5.0.
O comando tem a seguinte sintaxe:
db.runCommand( { update: <collection>, updates: [ { q: <query>, u: <document or pipeline>, c: <document>, // Added in MongoDB 5.0 upsert: <boolean>, multi: <boolean>, collation: <document>, arrayFilters: <array>, hint: <document|string> }, ... ], ordered: <boolean>, maxTimeMS: <integer>, writeConcern: { <write concern> }, bypassDocumentValidation: <boolean>, comment: <any>, let: <document> // Added in MongoDB 5.0 } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição | |||||
|---|---|---|---|---|---|---|---|
| string | O nome da coleção de destino. | |||||
| array | Uma array de uma ou mais declarações de atualização para executar na coleção denominada. Para obter detalhes sobre as declarações de atualização, consulte Declarações de atualização. | |||||
| booleano | Opcional. Se | |||||
| non-negative integer | Opcional. Especifica um limite de tempo em milissegundos. Se você não especificar um valor para O MongoDB encerra as operações que excedem o limite de tempo alocado usando o mesmo mecanismo de | |||||
| documento | Opcional. Um documento que Express a Não defina explicitamente a preocupação de gravação para a operação se for executada em uma transação. Para usar write concern com transações, consulte Transações e write concern. | |||||
| booleano | Opcional. Habilita | |||||
| any | Opcional. Um comentƔrio fornecido pelo usuƔrio para anexar a este comando. Depois de definido, esse comentƔrio aparece junto com os registros desse comando nos seguintes locais:
Um comentƔrio pode ser qualquer tipo BSON vƔlido (string, inteiro, objeto, array etc). | |||||
documento | Opcional. Especifica um documento com uma lista de variÔveis. Isso permite que você melhore a legibilidade do comando separando as variÔveis do texto da query. A sintaxe do documento é: A variÔvel é definida para o valor retornado pela expressão e não pode ser alterada posteriormente. Para acessar o valor de uma variÔvel no comando, use o prefixo de dois cifrões ( Para obter um exemplo completo, consulte Usar variÔveis na Novidades na versão 5.0. |
Atualizar declaraƧƵes
Cada elemento de array updates é um documento de instrução de atualização. Cada documento contém os seguintes campos:
Campo | Tipo | Descrição | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
documento | A consulta que corresponde aos documentos a serem atualizados. Use os mesmos seletores de consulta usados no mƩtodo | |||||||||||||||||||
documento ou pipeline | As modificaƧƵes a serem aplicadas. O valor pode ser:
Confira os detalhes em Comportamento. | |||||||||||||||||||
documento | Opcional. Você pode especificar Especifica um documento com uma lista de variÔveis. Isso permite que você melhore a legibilidade do comando separando as variÔveis do texto da query. A sintaxe do documento é: A variÔvel é definida para o valor retornado pela expressão e não pode ser alterada posteriormente. Para acessar o valor de uma variÔvel no comando, use o prefixo de dois cifrões ( Para usar uma variÔvel para filtrar os resultados, você deve acessar a variÔvel dentro do operador Para obter um exemplo completo usando Novidades na versão 5.0. | |||||||||||||||||||
booleano | Opcional. Quando,
Se Para evitar vÔrias atualizações, certifique-se de que os O padrão é | |||||||||||||||||||
| booleano | Opcional. Se Ao atualizar vÔrios documentos, se um único documento não for atualizado, outros documentos não serão atualizados. Consulte falhas de múltiplas atualizações para obter mais detalhes sobre esse comportamento. | ||||||||||||||||||
| documento | Opcional. Especifica o agrupamento a ser usado para a operação. A colocação permite que os usuĆ”rios especifiquem regras especĆficas do idioma para comparação de strings, como regras para letras maiĆŗsculas e marcas de acento. A opção de agrupamento tem a seguinte sintaxe: Ao especificar agrupamento, o campo Se o agrupamento nĆ£o for especificado, mas a coleção tiver um agrupamento padrĆ£o (consulte Se nenhum agrupamento for especificado para a coleção ou para as operaƧƵes, o MongoDB usa a comparação binĆ”ria simples usada nas versƵes anteriores para comparaƧƵes de strings. VocĆŖ nĆ£o pode especificar vĆ”rios agrupamentos para uma operação. Por exemplo, vocĆŖ nĆ£o pode especificar agrupamentos diferentes por campo ou, se estiver realizando uma busca com uma classificação, nĆ£o poderĆ” usar um agrupamento para a busca e outro para a classificação. | ||||||||||||||||||
| array | Opcional. Uma array de documentos de filtro que determina quais elementos da array modificar para uma operação de atualização em um campo da array. No documento de atualização, use o operador posicional filtrado O Você pode incluir o mesmo identificador vÔrias vezes no documento de atualização; entretanto, para cada identificador distinto ( No entanto, você pode especificar condições compostas no mesmo identificador em um único documento de filtro, como nos exemplos a seguir: Para obter exemplos, consulte Especificar | ||||||||||||||||||
Documento ou string | Opcional. Um documento ou string que especifica o Ćndice aser usado para dar suporte ao predicado de query. A opção pode usar um documento de especificação de Ćndice ou a string do nome do Ćndice. Se vocĆŖ especificar um Ćndice que nĆ£o existe, a operação emitirĆ” erros. Para um exemplo, consulte Especificar |
DevoluƧƵes
O comando retorna um documento que contém o status da operação. Por exemplo:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
Para obter detalhes sobre os campos de saĆda, consulte SaĆda.
Controle de acesso
Em implantaƧƵes executadas com authorization, o usuƔrio deve ter acesso que inclua os seguintes privilƩgios:
updateação na(s) coleção(ões) especificada(s).findação na(s) coleção(ões) especificada(s).insertação na(s) coleção(ões) especificada(s).
A função embutida readWrite fornece os privilégios exigidos.
Comportamento
LimitaƧƵes
Se você definir multi: true, use o comando update apenas para operações idempotentes.
Atualizar com um Documento de Expressões do Operador de Atualização
O campo de instrução de atualização u pode aceitar um documento que contenha apenas expressões de operador de atualização. Por exemplo:
updates: [ { q: <query>, u: { $set: { status: "D" }, $inc: { quantity: 2 } }, ... }, ... ]
Em seguida, o comando update atualiza somente os campos correspondentes no documento.
Atualizar com um documento de substituição
O campo u da declaração de atualização pode aceitar um documento de substituição, ou seja, o documento contém apenas expressões field:value. Por exemplo:
updates: [ { q: <query>, u: { status: "D", quantity: 4 }, ... }, ... ]
Em seguida, o comando update substitui o documento correspondente pelo documento de atualização. O comando update só pode substituir um único documento correspondente; ou seja, o campo multi não pode ser true. O comando update não substitui o valor _id.
Falhas em múltiplas atualizações
Se um único documento não for atualizado em um comando de atualização com o parâmetro multi definido como true, nenhum outro documento serÔ atualizado como parte desse comando.
Por exemplo, a coleção sample_mflix.movies contém filmes com campos imdb.rating. Crie um validador de documento na coleção movies com uma regra de que o valor imdb.rating deve ser menor ou igual a 10:
db.runCommand( { update: "movies", updates: [ { q: { year: { $gte: 2000, $lte: 2005 }, "imdb.rating": { $type: "number" } }, u: { $inc: { "imdb.rating": 1 } }, multi: true } ] } )
Se algum filme jÔ tiver uma classificação de 10, incrementÔ-lo violaria a regra de validação (classificação > 10). Quando isso acontece, a atualização é interrompida e nenhum outro documento é atualizado, mesmo que milhares de documentos correspondam à query.
Observação
Se um subconjunto de documentos correspondentes for atualizado, como quando uma atualização causaria a falha na validação de esquema de alguns documentos, o valor de nModified retornado pelo comando update pode não ser preciso.
Atualize com um pipeline de agregação.
O campo u da instrução de atualização pode aceitar um pipeline de agregação [ <stage1>, <stage2>, ... ] que especifica as modificações a serem realizadas. O pipeline pode consistir nas seguintes etapas:
$addFieldse seu alias$set$replaceRoote seu alias$replaceWith
O uso do aggregation pipeline permite uma instrução de atualização mais expressiva, como atualizações condicionais Express com base em valores de campo atuais ou atualização de um campo usando o valor de outro(s) campo(s).
Por exemplo:
updates: [ { q: <query>, u: [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ], ... }, ... ]
Observação
Para obter exemplos, consulte Atualizar com pipeline de agregação.
Upsert com Ćndice exclusivo
Os upserts podem criar documentos duplicados, a menos que haja um Ćndice Ćŗnico para evitar duplicatas.
Considere um exemplo em que nenhum documento com o nome Andy existe e vƔrios clientes emitem o seguinte comando ao mesmo tempo:
db.runCommand( { update: "people", updates: [ { q: { name: "Andy" }, u: { $inc: { score: 1 } }, multi: true, upsert: true } ] } )
Se todas as operaƧƵes update terminarem a fase de query antes que qualquer cliente insira dados com ĆŖxito e nĆ£o houver nenhum Ćndice exclusivo no campo name, cada operação update poderĆ” resultar em uma inserção, criando vĆ”rios documentos com name: Andy.
Um Ćndice exclusivo no campo name garante que somente um documento seja criado. Com um Ćndice Ćŗnico em vigor, as mĆŗltiplas operaƧƵes update agora apresentam o seguinte comportamento:
Exatamente uma operação
updateinserirÔ com êxito um novo documento.Outras operações
updateatualizam o documento recém-inserido ou falham devido a uma colisão de chave exclusiva.Para que outras operações
updateatualizem o documento recĆ©m-inserido, todas as seguintes condiƧƵes devem ser atendidas:A collection de destino tem um Ćndice Ćŗnico que causaria um erro de chave duplicado.
A operação de atualização não é
updateManyoumultiéfalse.A condição de correspondência de atualização é:
Um Ćŗnico predicado de igualdade. Por exemplo
{ "fieldA" : "valueA" }Um E lógico de predicados de igualdade. Por exemplo
{ "fieldA" : "valueA", "fieldB" : "valueB" }
O campo no predicado de igualdade correspondem ao campo no padrĆ£o de chave de Ćndice Ćŗnico.
A operação de atualização nĆ£o modifica nenhum campo no padrĆ£o de chave de Ćndice Ćŗnico.
A tabela a seguir mostra exemplos de operações upsert que, quando ocorre uma colisão de chaves, resultam em uma atualização ou falha.
PadrĆ£o de chave de Ćndice exclusivo | Operação de atualização | Resultado | ||||||
|---|---|---|---|---|---|---|---|---|
| | O campo | ||||||
| | A operação falha porque modifica o campo no padrĆ£o de chave de Ćndice Ćŗnico ( | ||||||
| | A operação falha porque os campos de predicados de igualdade ( |
Limites
Para cada elemento de atualização na array updates, a soma da query e os tamanhos de atualização (ou seja, q e u ) devem ser menores ou iguais ao tamanho mÔximo do documento BSON.
O número total de instruções de atualização na array updates deve ser menor ou igual ao tamanho mÔximo em massa.
Validação de esquema
O comando update adiciona suporte para a opção bypassDocumentValidation, que permite ignorar a validação de esquema ao inserir ou atualizar documentos em uma coleção com regras de validação.
ColeƧƵes fragmentadas
upsert em uma coleção fragmentada
Para usar update com multi: false em uma coleção fragmentada,
Se você não especificar upsert: true, o filtro q deverÔ incluir uma correspondência de igualdade no campo
_idou direcionar um Ćŗnico fragmento (por exemplo, incluindo a chave de fragmento).Se vocĆŖ especificar upsert: true, o filtro q deverĆ” incluir uma correspondĆŖncia de igualdade na chave de fragmento.
No entanto, os documentos em uma coleção fragmentada podem estar faltando os campos de chave de fragmento. Para direcionar um documento que não possui a chave de fragmento, você pode usar a
nullcorrespondência de igualdade em conjunto com outra condição de filtro (como no campo_id). Por exemplo:{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
Substituir documento
Ao substituir um documento, update tenta direcionar um fragmento, primeiro usando o filtro de query. Se a operação não puder direcionar um único fragmento pelo filtro de query, ela tentarÔ direcionar pelo documento de substituição.
Modificação da chave de fragmento
Você pode atualizar o valor da chave de fragmento de um documento, a menos que o campo de chave de fragmento seja o campo de _id imutÔvel.
Para modificar o valor da chave de fragmento existente com update:
VocĆŖ deve executar em um
mongos. NĆ£o emita a operação diretamente no fragmento.VocĆŖ deve executar em uma transação ou como uma gravação repetĆvel.
VocĆŖ deve especificar
multi: false.VocĆŖ deve incluir um filtro de queries de igualdade na chave de fragmento completa.
Dica
Como um valor de chave ausente Ć© retornado como parte de uma correspondĆŖncia de igualdade nula,
para evitar a atualização de uma chave de valor nulo, inclua
condiƧƵes de consulta (como no campo _id) conforme apropriado.
Consulte também upsert em uma coleção fragmentada.
Chave de fragmento ausente
Os documentos em coleções fragmentadas podem não ter os campos de chave de fragmento. Para usar update a fim de definir a chave de fragmento ausente do documento, é necessÔrio executar em um mongos. Não emita a operação diretamente no fragmento.
AlƩm disso, os seguintes requisitos tambƩm se aplicam:
Tarefa | Requisitos |
|---|---|
Para definir como |
|
Para definir um valor diferente de |
|
Dica
Como um valor de chave ausente Ć© retornado como parte de uma correspondĆŖncia de igualdade nula,
para evitar a atualização de uma chave de valor nulo, inclua
condiƧƵes de consulta (como no campo _id) conforme apropriado.
Veja tambƩm:
TransaƧƵes
update pode ser usado dentro de transaƧƵes distribuĆdas.
Importante
Na maioria dos casos, uma transação distribuĆda incorre em um custo de desempenho maior do que as gravaƧƵes de um Ćŗnico documento, e a disponibilidade de transaƧƵes distribuĆdas nĆ£o deve substituir o design eficaz do esquema. Em muitos cenĆ”rios, o modelo de dados desnormalizado (documentos e arrays incorporados) continuarĆ” a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenĆ”rios, modelar seus dados adequadamente minimizarĆ” a necessidade de transaƧƵes distribuĆdas.
Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.
Inserção nas Transações
VocĆŖ pode criar coleção e Ćndices dentro de uma transação distribuĆda se a transação nĆ£o for uma transação de gravação cross-fragmento.
update com upsert: true pode ser executado em uma coleção existente ou em uma coleção inexistente. Se for executada em uma coleção inexistente, a operação cria a coleção.
Write concerns e transaƧƵes
Não defina explicitamente a preocupação de gravação para a operação se for executada em uma transação. Para usar write concern com transações, consulte Transações e write concern.
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.
Atualizar campos especĆficos de um documento
Use operadores de atualização para atualizar apenas os campos especificados de um documento.
Por exemplo, os documentos na coleção movies do banco de dados sample_mflix contêm campos como title, year e num_mflix_comments.
O comando a seguir usa os operadores de atualização $set e $inc para atualizar os campos year e num_mflix_comments de um documento em que title é igual a "The Godfather":
db.runCommand( { update: "movies", updates: [ { q: { title: "The Godfather" }, u: { $set: { year: 1972 }, $inc: { num_mflix_comments: 1 } } } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Como <update> documento não especifica o campo de multi opcional, a atualização modifica apenas um documento, mesmo que mais de um documento corresponda à condição de correspondência de q .
Consulte SaĆda para detalhes.
Atualizar campos especĆficos de vĆ”rios documentos
Use operadores de atualização para atualizar apenas os campos especificados de um documento e inclua o campo multi definido como true na instrução update.
Por exemplo, os documentos na coleção movies do banco de dados sample_mflix contêm campos como year e num_mflix_comments.
O comando a seguir usa o operador de atualização $inc para incrementar o campo num_mflix_comments para todos os filmes lançados em 1924:
db.runCommand( { update: "movies", updates: [ { q: { year: 1924 }, u: { $inc: { num_mflix_comments: 1 }, $set: { classic: true, era: "silent" } }, multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Como o campo multi estĆ” configurado para true, a atualização modifica todos os documentos do 6 que correspondem Ć query especificada no campo q e retorna a seguinte saĆda:
{ n: 6, nModified: 6, ok: 1, '...': '...' }
Consulte SaĆda para detalhes.
Atualização com aggregation pipeline
O comando update pode usar um pipeline de agregação para a atualização. O pipeline pode consistir nas seguintes etapas:
$addFieldse seu alias$set$replaceRoote seu alias$replaceWith
O uso do aggregation pipeline permite uma instrução de atualização mais expressiva, como atualizações condicionais Express com base em valores de campo atuais ou atualização de um campo usando o valor de outro(s) campo(s).
Exemplo 1
Os exemplos a seguir usam o aggregation pipeline para modificar um campo usando os valores de outros campos no documento.
Os documentos na coleção users do banco de dados sample_mflix contêm campos como name e email.
A seguinte operação de atualização utiliza um pipeline de agregação para adicionar novos campos ao documento de um usuĆ”rio especĆfico:
db.runCommand( { update: "users", updates: [ { q: { name: "Robert Baratheon" }, u: [ { $set: { full_info: { $concat: [ "$name", " - ", "$email" ] } } }, { $set: { status: "active" } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Exemplo 2
O aggregation pipeline permite que a atualização execute atualizações condicionais com base nos valores de campo atuais, bem como use valores de campo atuais para calcular um valor de campo separado.
Os documentos na coleção movies do banco de dados sample_mflix têm um campo year .
O exemplo a seguir usa um pipeline de agregação para calcular a idade de "O grande roubo do trem" e atribuir uma classificação de era com base em quando ele foi lançado.
db.runCommand( { update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: [ { $set: { age: { $subtract: [ 2026, "$year" ] } } }, { $set: { era: { $switch: { branches: [ { case: { $lt: [ "$year", 1960 ] }, then: "Classic" }, { case: { $lt: [ "$year", 1980 ] }, then: "Golden Age" }, { case: { $lt: [ "$year", 2000 ] }, then: "Modern" }, { case: { $gte: [ "$year", 2000 ] }, then: "Contemporary" } ], default: "Unknown" } } } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Observação
- Primeira etapa
- O estƔgio
$setcalcula um novo campoagecom base na diferenƧa entre 2026 e o ano de lanƧamento do filme. Consulte$subtractpara obter mais informaƧƵes. - Segunda etapa
- O estƔgio
$setcalcula um novo campoeracom base no campoyearusando lógica condicional. Consulte$switchpara obter mais informações sobre o operador de agregação$switch.
Atualização em Massa
O exemplo a seguir executa vÔrias operações de atualização em um único comando para atualizar documentos existentes e inserir novos documentos. A operação:
marca filmes de gĆŖnero bem avaliados de 2015 como
featuredcategoriza curtas-metragens de ação e sucesso de 2012 como
melodramaupsert um novo filme de ficção cientĆfica de 2024 se nĆ£o existir
db.runCommand( { update: "movies", updates: [ // Update highly-rated Horror movies from 2015 { q: { year: 2015, genres: "Horror", "imdb.rating": { $gte: 7 } }, u: { $set: { featured: true } }, multi: true }, // Update short Drama/Romance movies from 2012 { q: { year: 2012, genres: { $all: ["Drama", "Romance"] }, runtime: { $lt: 90 } }, u: { $set: { category: "melodrama" } }, multi: true }, // Upsert a new movie from 2026 { q: { title: "A New Movie", year: 2026 }, u: { $set: { genres: ["Sci-Fi", "Adventure"], runtime: 142, "imdb.rating": 8.5, featured: true } }, upsert: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
O documento retornado mostra que o comando modificou os documentos existentes e inseriu um novo documento por upsert. Consulte SaĆda para detalhes.
{ n: 16, upserted: [ { index: 2, _id: ObjectId('69861e680e6ea1f51160fe1c') } ], nModified: 15, ok: 1, '...': '...' }
Especifique o agrupamento
A colocação permite que os usuĆ”rios especifiquem regras especĆficas do idioma para comparação de strings, como regras para letras maiĆŗsculas e marcas de acento.
Os documentos na coleção movies do banco de dados sample_mflix têm campos como title e year.
A operação a seguir usa agrupamento para executar uma pesquisa sem diferenciação de maiúsculas e minúsculas. A query pesquisa "the godfather" em letras minúsculas, mas com o agrupamento strength: 1, a query corresponde a "The Godfather", independentemente da capitalização:
db.runCommand({ update: "movies", updates: [ { q: { title: "the godfather" }, u: { $set: { featured: true } }, collation: { locale: "en", strength: 1 } } ] })
Especificar arrayFilters para operações de atualização de array
Ao atualizar um campo de array, vocĆŖ pode especificar arrayFilters que determinam quais elementos de array atualizar.
Atualizar elementos que correspondem aos critƩrios arrayFilters
Os documentos na coleção movies do banco de dados sample_mflix têm um campo de array languages.
O exemplo a seguir atualiza todos os filmes que têm "English" em sua array languages. A operação substitui "English" por "EN".
db.runCommand( { update: "movies", updates: [ { q: { languages: "English" }, u: { $set: { "languages.$[element]" : "EN" } }, arrayFilters: [ { "element": "English" } ], multi: true} ] } )
Atualizar elementos especĆficos de uma array de documentos
Os documentos na coleção movies do banco de dados sample_mflix têm uma array cast que lista os nomes dos atores.
O exemplo a seguir localiza um filme com o tĆtulo "The Godfather" e substitui "Al Pacino" por "REDACTED" em sua array cast. A opção arrayFilters especifica quais elementos da array devem ser atualizados:
db.runCommand({ update: "movies", updates: [ { q: { title: "The Godfather" }, u: { $set: { "cast.$[elem]" : "REDACTED" } }, arrayFilters: [ { "elem": "Al Pacino" } ], multi: false } ] })
Especifique hint para operações de atualização
Os documentos na coleção movies do banco de dados sample_mflix têm campos como year e num_mflix_comments.
Crie os seguintes Ćndices na coleção:
[ db.movies.createIndex( { year: 1 } ), db.movies.createIndex( { num_mflix_comments: 1 } ) ]
A seguinte operação de atualização incrementa o campo num_mflix_comments para "O grande roubo do trem" e sugere explicitamente o uso do Ćndice { year: 1 }:
Observação
Se vocĆŖ especificar um Ćndice que nĆ£o existe, a operação emitirĆ” erros.
db.runCommand({ update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: false } ] })
Para visualizar o Ćndice utilizado, vocĆŖ pode executar o explain em uma operação de atualização. Por exemplo, o seguinte explica uma atualização que incrementa num_mflix_comments para filmes com 5 ou menos comentĆ”rios lanƧados em 2000 ou posterior:
db.runCommand( { explain: { update: "movies", updates: [ { q: { "num_mflix_comments": { $lte: 5 }, "year": { $gte: 2000 } }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: true } ] }, verbosity: "queryPlanner" } )
O explain não modifica os documentos.
Usar variÔveis na opção let ou no campo c
Novidades na versão 5.0.
As variÔveis podem ser definidas na opção let ou no campo c e acessadas no array updates.
Observação
Para filtrar resultados usando uma variÔvel, você deve acessar a variÔvel dentro do operador $expr.
Os documentos na coleção movies do banco de dados sample_mflix têm campos como title e year.
O exemplo seguinte utiliza a opção let para definir variÔveis para localizar e adicionar um novo campo a um filme.
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ] } ], let : { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } )
O exemplo a seguir define movieTitle e franchiseName variƔveis em c e usa as variƔveis para adicionar um campo franchise .
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ], c: { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } ] } )
SaĆda
O documento devolvido contƩm um subconjunto dos seguintes campos:
update.nUm comando
updateaceita uma array de atualizações de documentos, algumas das quais podem ser upserts. Para uma atualização,nindica o número de documentos selecionados para a atualização. Para um upsert,né1para o documento inserido. O servidor adiciona os valores denpara todas as atualizações e upserts e retorna o total comoupdate.n.Se uma operação de atualização resultar em nenhuma alteração no documento, por exemplo, a expressão
$setatualiza o valor para o valor atual,npode ser maior quenModified.
update.nModifiedO número de documentos atualizados. Se a operação de atualização não resultar em nenhuma alteração no documento, como definir o valor do campo com seu valor atual,
nModifiedpoderÔ ser menor quen.Observação
Se um subconjunto de documentos correspondentes for atualizado, como quando uma atualização causaria a falha na validação de esquema de alguns documentos, o valor de
nModifiedretornado pelo comandoupdatepode não ser preciso.
update.upsertedUma array de documentos que contém informações para cada documento inserido através da atualização com
upsert: true.Cada documento contƩm as seguintes informaƧƵes:
update.writeErrorsUmo array de documentos que contém informações sobre qualquer erro encontrado durante a operação de atualização. o array
writeErrorscontém um documento de erro para cada instrução de atualização com erro.Cada documento de erro contém os seguintes campos:
update.writeConcernErrorUmo array de documentos que contém informações sobre qualquer erro encontrado durante a operação de atualização.
Alterado na 7.0.6 versĆ£o: (tambĆ©m disponĆvel em 6.0.14 e 5.0.30): Quando Ć©
updatemongosexecutado em , erros de preocupação de gravação são sempre relatados, mesmo quando ocorrem um ou mais erros de escrita. Em versões anteriores, a ocorrência de erros de gravação poderia fazer com queupdatenão relatasse erros de preocupação de gravação .Cada documento de erro contém os seguintes campos:
update.writeConcernError.errInfo.writeConcernO objeto de write concern usado para a operação correspondente. Para obter informações sobre os campos de objeto de write concern, consulte Especificação de write concern.
O objeto de write concern tambƩm pode conter o seguinte campo, indicando a origem da write concern:
update.writeConcernError.errInfo.writeConcern.provenanceUm valor de string que indica a origem do write concern (conhecido como write concern
provenance). A tabela a seguir mostra os valores possĆveis para este campo e sua significĆ¢ncia:ProveniĆŖnciaDescriçãoclientSuppliedA preocupação de gravação foi especificada no aplicativo.
customDefaultA preocupação de gravação originou-se de um valor padrão personalizado definido. Consulte
setDefaultRWConcern.getLastErrorDefaultsA preocupação de gravação originada do campo
settings.getLastErrorDefaultsdo conjunto de réplicas.implicitDefaultA preocupação de gravação originou-se do servidor na ausência de todas as outras especificações de preocupação de gravação.
Alterado na versão 8.1.2.
Quando update é executado em mongos em um cluster fragmentado, um writeConcernError é sempre relatado na resposta, mesmo quando ocorre um ou mais erros. Em versões anteriores, outros erros às vezes faziam com que update não relatasse erros de preocupação de gravação.
Por exemplo, se um documento falhar na validação, desencadeando um erro DocumentValidationFailed e tambĆ©m ocorrer um erro de preocupação de gravação , o erro DocumentValidationFailed e o writeConcernError serĆ£o retornados no campo de nĆvel superior da resposta.
AlĆ©m dos campos de retorno especĆficos de atualização mencionados acima, o db.runCommand() inclui informaƧƵes adicionais:
para conjuntos de rƩplicas:
optime,electionId,$clusterTimeeoperationTime.para clusters fragmentados:
operationTimee$clusterTime.
Consulte Resposta db.runCommand para obter detalhes sobre esses campos.
A seguir, um exemplo de documento retornado para um comando update bem-sucedido que executou um upsert:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
A seguir, um exemplo de documento retornado para uma atualização em lote envolvendo três comandos de atualização, em que um comando de atualização foi bem-sucedido e dois outros comandos de atualização encontraram erros:
{ "ok" : 1, "nModified" : 1, "n" : 1, "writeErrors" : [ { "index" : 1, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 5.0}." }, { "index" : 2, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 2.0} to {_id: 6.0}." }, ] }