Importante
Método de mongosh obsoleto
Esse método está obsoleto em mongosh. Para obter métodos alternativos, consulte Alterações de compatibilidade com o shell mongo legado.
Definição
db.collection.update(query, update, options)Modifica um documento ou documentos existentes em uma coleção. O método pode modificar campos específicos de um documento ou documentos existentes ou substituir um documento existente completamente, dependendo do parâmetro de atualização.
Por padrão, o método
db.collection.update()atualiza um documento único. Inclua a opção multi: true para atualizar todos os documentos que correspondam aos critérios de query.
Compatibilidade
Esse método 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 método db.collection.update() tem o seguinte formato:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string>, let: <document>, maxTimeMS: <int>, bypassDocumentValidation: <boolean> } )
Parâmetros
O método db.collection.update() utiliza os seguintes parâmetros:
Parâmetro | Tipo | Descrição | ||||||
|---|---|---|---|---|---|---|---|---|
documento | Os critérios de seleção para a atualização. Os mesmos seletores de consulta que no método Quando você executa um | |||||||
documento ou pipeline | As modificações a serem aplicadas. Podem ser uma dos seguintes:
Para obter detalhes e exemplos, consulte Entradas de oplog. | |||||||
booleano | Opcional. Quando,
Se Para evitar várias atualizações, certifique-se de que os O padrão é | |||||||
booleano | Opcional. Se definido como | |||||||
documento | Opcional. Um documento expressando preocupação de gravação. Omita o uso da preocupação de gravação 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. Para obter um exemplo | |||||||
documento | Opcional. 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. Para ver um exemplo | |||||||
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, utilize o para definir um Você não pode ter um documento de filtro de array para um identificador se o identificador não estiver incluído no documento de atualização. Por exemplo,consulte Operações de atualização de array. | |||||||
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 | |||||||
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 usar uma variável para filtrar os resultados, você deve acessar a variável dentro do operador Para um exemplo completo utilizando | |||||||
inteiro | Opcional. Especifica o limite de tempo, em milésimos de segundo, para que a operação de atualizar seja executada antes de atingir o tempo limite. | |||||||
booleano | Opcional. Permite que o |
Devoluções
O método retorna um documento WriteResult que contém o status da operação.
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(s) especificada(s) se a operação resultar em um upsert.
A função embutida readWrite fornece os privilégios exigidos.
Comportamento
Limitações
Se você definir multi: true, utilize o método update() apenas para operações idempotente.
Usando $expr em uma atualização com Upsert
A tentativa de usar o operador $expr com o sinalizador upsert definido como true gerará um erro.
Coleções fragmentadas
Para usar db.collection.update() com multi: false em uma coleção fragmentada, é necessário incluir uma correspondência exata no campo _id ou direcionar um único fragmento (por exemplo, incluindo a chave do fragmento).
Quando o db.collection.update() executar operações de atualização (e não documentar operações de substituição), o db.collection.update() poderá direcionar vários fragmentos.
Dica
Substituir operações de documentos em uma coleção fragmentada
As operações de substituição de documentos tentam direcionar um único 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.
Em versões anteriores, a operação tenta direcionar usando o documento de substituição.
upsert em uma coleção fragmentada
No caso das operações de db.collection.update() que incluam upsert: true e estejam em uma coleção fragmentada, você deve incluir a chave de fragmento completa no filter:
Para uma operação de atualização.
Para uma operação de substituição de documento.
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 null correspondê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
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 db.collection.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 db.collection.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
db.collection.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.
db.collection.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.
Entradas de oplog
Se uma operação db.collection.update() atualizar um ou mais documentos com êxito, a operação adicionará uma entrada no oplog (log de operações). Se a operação falhar ou não encontrar nenhum documento para atualizar, a operação não adicionará uma entrada no oplog.
Upsert com _id query pontilhada
Quando você executar um update() com upsert:
true e a query não corresponder a nenhum documento existente, o MongoDB irá se recusar a inserir um novo documento se a query especificar condições no campo _id usando notação de ponto.
Essa restrição garante que a ordem dos campos inseridos no documento _id seja bem definida e não esteja vinculada à ordem especificada na consulta.
Se você tentar inserir um documento dessa forma, o MongoDB gerará um erro.
Upsert com valores duplicados
Os upserts podem criar documentos duplicados, a menos que haja um índice único para evitar duplicatas.
Se todas as db.collection.update() operações concluírem a fase de query antes que qualquer cliente insira dados com êxitoe não houver nenhum índice único no name campo, cada db.collection.update() operação poderá resultar em uma inserção, criando vários documentos name: Andy com.
Um índice único no campo name garante que apenas um documento seja criado. Com um índice único em vigor, as operações múltiplas db.collection.update() agora exibem o seguinte comportamento:
- Exatamente uma operação
db.collection.update()inserirá com sucesso um novo - documento.
- Exatamente uma operação
- Outras operações
db.collection.update()atualizam o recém-inserido documento ou falha devido a uma colisão de chave exclusiva.
Para que outras
db.collection.update()operações atualizem 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 duplicada.
- A operação de atualização não é
updateManyoumultié false.
- A operação de atualização não é
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" }
- Os campos no predicado de igualdade correspondem aos campos 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 .
- Outras operações
Dica
Operações de atualização de array
No documento de atualização, use o operador posicional filtrado $[<identifier>] para definir um identificador, que você então faz referência nos documentos de filtro de array. Você não pode ter um documento de filtro de array para um identificador se o identificador não estiver incluído no documento de atualização.
O <identifier> deve começar com uma letra minúscula e conter apenas caracteres alfanuméricos.
Você pode incluir o mesmo identificador várias vezes no documento de atualização; no entanto, para cada identificador distinto$[identifier] () no documento de atualização, você deve especificar exatamente um documento de filtro de matriz correspondente. Ou seja, não é possível especificar vários documentos de filtro de matriz para o mesmo identificador. No entanto, você pode especificar condições compostas no mesmo identificador em um único documento de filtro
Observação
arrayFilters não está disponível para atualizações que usam um pipeline de agregação
WriteResult
Resultados bem-sucedidos
O método db.collection.update() retorna um objeto que contém o WriteResult() WriteResult() status da operação. Após o sucesso, o objeto contém o número de documentos que corresponderam à condição de consulta, o número de documentos inseridos pela atualização e o número de documentos modificados.
Erros de preocupação de gravação
Se o db.collection.update() método encontrar erros de preocupação de gravação , os resultados incluirão o campo.WriteResult.writeConcernError
A tabela a seguir explica os possíveis valores de WriteResult.writeConcernError.provenance:
Proveniência | Descrição |
|---|---|
| A preocupação de gravação foi especificada no aplicativo. |
| A preocupação de gravação originou-se de um valor padrão personalizado definido. Consulte |
| A preocupação de gravação originada do campo |
| A preocupação de gravação originou-se do servidor na ausência de todas as outras especificações de preocupação de gravação. |
Erros não relacionados a preocupação de gravação
Se o db.collection.update() método encontrar um erro que não seja preocupação de gravação , os resultados incluirão o WriteResult.writeError campo.
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.
Usar expressões do operador de atualização ($inc $sete)
Se o documento <update> contiver modificadores operador de atualização, como aqueles que utilizam o modificador $set, então:
O documento
<update>deve conter somente expressões do operador de atualização.O método
db.collection.update()atualiza somente os campos correspondentes no documento.Para atualizar um documento incorporado ou uma array como um todo, especifique o valor de substituição para o campo.
Para atualizar campos específicos em um documento incorporado ou em uma array, use notação de ponto para especificar o campo.
db.movies.update( { title: "The Godfather" }, { $inc: { "tomatoes.viewer.numReviews": 1 }, $set: { "tomatoes.viewer.meter": 99 } } ) /* Corresponds to the following SQL statement: * UPDATE movies * SET tomatoes_viewer_numReviews = tomatoes_viewer_numReviews + 1, * tomatoes_viewer_meter = 99 * WHERE title = "The Godfather" */
Nesta operação:
O parâmetro
<query>do{ title: "The Godfather" }especifica qual documento atualizaro operador incrementa
$inconumReviewscampo notomatoes.viewerdocumento incorporadoo operador atualiza
$setometercampo notomatoes.viewerdocumento incorporado.
Se o parâmetro query corresponder a vários documentos, a operação atualizará somente um documento correspondente. Para atualizar vários documentos, defina a opção multi como true.
Remover campos$unset ()
A operação a seguir usa o operador para remover $unset o metacritic campo do documento"O Poderoso Chefão".
db.movies.update( { title: "The Godfather" }, { $unset: { metacritic: "" } } ) /* $unset is similar (but not identical) to the following SQL command which removes the ``metacritic`` field from the ``movies`` table * UPDATE movies * SET metacritic = NULL * WHERE title = "The Godfather" */
Após a atualização, o campo metacritic é removido.
Atualizar Vários Documentos ($update multiCom)
Se multi estiver definido como true, o método db.collection.update() atualiza todos os documentos que atendem aos critérios <query>. A operação de atualização multi pode ser intercalada com outras operações de leitura/gravação.
A operação a seguir define o campo test_field como true para documentos cujo título é "O Poderoso Chefão" ou "A Matriz".
db.movies.update( { title: { $in: ["The Godfather", "The Matrix"] } }, { $set: { test_field: true } }, { multi: true } ) /* Corresponds to the following SQL statement: * UPDATE movies * SET test_field = true * WHERE title IN ('The Godfather', 'The Matrix') */
A operação atualiza ambos os documentos correspondentes.
Não é possível especificar multi: true ao realizar uma substituição e o documento de atualização contém apenas expressões field:value.
Dica
Inserir um novo documento se não houver correspondênciaUpsert ()
Quando você especifica a opção upsert: true:
Se o(s) documento(s) corresponder(em) aos critérios de query,
db.collection.update()executará uma atualização.Se nenhum documento corresponder aos critérios de query,
db.collection.update()insere um único documento.Observação
Se vários upserts idênticos forem emitidos aproximadamente ao mesmo tempo, é possível que
update()usado com upsert: true crie documentos duplicados. Consulte Upsert com valores duplicados para obter mais informações.
Se você especificar upsert: true em uma coleção fragmentada, deverá incluir a chave de fragmento completa em filter. Para comportamento adicional do db.collection.update() em uma coleção fragmentada, consulte Coleções fragmentadas.
As abas a seguir mostram uma variedade de usos do modificador upsert com update()..
Upsert com documento de substituição
Se nenhum documento corresponder aos critérios de query e o parâmetro <update> for um documento de substituição (ou seja, contiver somente pares de campo e valor), a atualização inserirá um novo documento com os campos e valores do documento de substituição.
Se você especificar um campo
_idno parâmetro de query ou documento de substituição, o MongoDB utilizará esse campo_idno documento inserido.Se você não especificar um campo
_idno parâmetro de query ou no documento de substituição, o MongoDB adicionará o campo_idcom um valor de ObjectId gerado aleatoriamente.Você não pode especificar diferentes valores de campo
_idno parâmetro de query e documento de substituição. Se o fizer, a operação apresentará erros.
Por exemplo, a atualização a seguir define a opção upsert como true:
db.movies.update( { title: "Test Movie 12345" }, { $set: { title: "Test Movie 12345", year: 2024, genres: [ "Documentary" ], rated: "NR" } }, { upsert: true } )
Se nenhum documento corresponder ao <query> parâmetro, a operação de atualização inserirá um documento somente com o documento de substituição. Como nenhum _id campo foi especificado no documento de substituição ou documento de query, a operação cria um novo exclusivo ObjectId para o campo do novo _id documento. Você pode visualizar refletido upsert no WriteResult da operação.
Upsert com expressões do operador$set ()
Se nenhum documento corresponder aos critérios de query e o parâmetro <update> for um documento com expressão de operador de atualização, a operação criará um documento base a partir das cláusulas de igualdade no parâmetro <query> e aplicará as expressão do parâmetro <update>.
As operações de comparação do <query> não serão incluídas no novo documento. Se o novo documento não incluir o campo _id , o MongoDB adicionará o campo _id com um valor ObjectId .
Por exemplo, a atualização a seguir define a opção upsert como true:
db.movies.update( { title: "Test Movie 67890" }, // Query parameter { // Update document $set: { rated: "PG" }, $setOnInsert: { year: 2024, type: "movie" } }, { upsert: true } // Options )
Se nenhum documento corresponder à condição de query, a operação inserirá o documento correspondente.
Dica
Upsert usando um pipeline de agregação
Se o parâmetro <update> for um pipeline de agregação, a atualização criará um documento base a partir das cláusulas de igualdade no parâmetro <query> e, em seguida, aplicará o pipeline ao documento para criar o documento a ser inserido. Se o novo documento não incluir o campo _id, o MongoDB adicionará o campo _id com um valor ObjectId.
Por exemplo, o seguinte pipeline de agregação insere um novo documento na collection movies porque não há um documento existente que corresponda ao filtro de query:
db.movies.update( { title: "Test Movie ABC123" }, // Query parameter [ // Aggregation pipeline { $set: { year: 2024, type: "movie", rated: "NR", lastModified: "$$NOW" } } ], { upsert: true } // Options )
Dica
Para obter exemplos adicionais de atualizações usando pipelines de agregação, consulte Atualizar com pipeline de agregação.
Usando com upsert multi (Match)
A operação a seguir especifica a opção multi e a opção upsert. Se houver documentos correspondentes, a operação atualizará todos os documentos correspondentes. Se não houver documentos correspondentes, a operação inserirá um novo documento.
db.movies.update( { title: { $in: ["The Godfather", "The Matrix"] } }, { $set: { test_upsert_field: true } }, { upsert: true, multi: true } )
Como ambos os filmes existem na coleção, a operação atualiza ambos os documentos correspondentes.
Usando com upsert multi (sem correspondência)
Se a coleção não tivesse nenhum documento correspondente, a operação resultaria na inserção de um único documento usando os campos das especificações <query> e <update>. Por exemplo, considere a seguinte operação:
db.movies.update( { "title": "Test Movie Unique789" }, { $set: { year: 2024, type: "movie" } }, { upsert: true, multi: true } )
A operação insere o documento correspondente na coleção movies.
Atualização com aggregation pipeline
O método db.collection.update() 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).
Modificar um campo usando os valores dos outros campos no documento
O exemplo a seguir cria um campo displayTitle que combina o título e o ano do filme com um pipeline de agregação que executa estas operações:
cria um campo
displayTitleconcatenando os campostitleeyeardefine um carimbo de data/hora
lastModified
db.movies.update( { title: "The Godfather" }, [ { $set: { displayTitle: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] }, lastModified: "$$NOW" } } ] )
Executar atualizações condicionais com base nos valores de campo atuais
O exemplo a seguir atualiza filmes lançados em 2015 para calcular uma pontuação de classificação combinada a partir das classificações IMDB e Tomatoes e atribuir uma nota com base na pontuação.
db.movies.update( { year: 2015, "imdb.rating": { $type: "number" }, "tomatoes.viewer.rating": { $type: "number" } }, [ { $set: { combinedScore: { $round: [ { $avg: [ { $multiply: [ "$imdb.rating", 10 ] }, { $multiply: [ "$tomatoes.viewer.rating", 10 ] } ] }, 1 ] }, lastUpdate: "$$NOW" } }, { $set: { grade: { $switch: { branches: [ { case: { $gte: [ "$combinedScore", 80 ] }, then: "A" }, { case: { $gte: [ "$combinedScore", 70 ] }, then: "B" }, { case: { $gte: [ "$combinedScore", 60 ] }, then: "C" }, { case: { $gte: [ "$combinedScore", 50 ] }, then: "D" } ], default: "F" } } } } ], { multi: true } )
Observação
O estágio $set:
calcula um novo campo calculando
combinedScorea média da classificação do IMDB (escalonada 10 por) e da classificação do visualizador do Tomatoes (escalonada 10 por) e, em seguida, arredondando para uma casa decimal.$avg$multiplyConsulte, e para$roundobter mais informações.define o campo
lastUpdatepara o valor da variável de agregaçãoNOW.atribui uma nota de letra com base no
combinedScoreusando o$switchoperador.
Especificar arrayFilters para operações de atualização de array
arrayFilters Atualizar elementos que correspondem aos critérios
Para atualizar todos os elementos de array que correspondem a um critério especificado, utilize o parâmetro arrayFilters.
O exemplo a seguir atualiza todos os filmes que têm "English" em sua array languages. A operação substitui "English" por "EN".
db.movies.update( { languages: "English" }, { $set: { "languages.$[element]" : "EN" } }, { arrayFilters: [ { "element": "English" } ], multi: true } )
Atualizar Elementos Específicos de uma Matriz Usando Correspondência de Padrão
Você também pode usar o parâmetro arrayFilters com o operador posicional filtrado para atualizar elementos de array específicos que correspondem a um padrão.
O exemplo a seguir usa o filme "O Poderoso Chefão" da collection existente, que tem uma array writers. A operação atualiza apenas os escritores cujos nomes contêm "roteiro" anexando um sufixo.
db.movies.update( { title: "The Godfather" }, { $set: { "writers.$[elem]" : { $concat: [ "$elem", " - UPDATED" ] } } }, { arrayFilters: [ { "elem": { $regex: /screenplay/ } } ] } )
A operação tem como alvo o documento "O Poderoso Chefão" e atualiza apenas os elementos de array que correspondem aos critérios de filtro. Após a operação, os roteiristas que trabalharam no roteiro têm " - Atualizado "em anexado.
Especifique hint para operações de atualização
A opção hint permite a você especificar qual índice MongoDB deve utilizar para a operação de atualização. Isso é útil ao atualizar vários documentos e você deseja garantir que um índice específico seja usado para desempenho. Este exemplo utiliza a coleção movies existente do banco de dados sample_mflix.
Primeiro, crie um índice no campo year :
db.movies.createIndex( { year: 1 } )
A seguinte operação de atualização sugere explicitamente o uso do { year: 1 } índice para atualizar todos os filmes 2010de2015 a:
db.movies.update( { year: { $gte: 2010, $lte: 2015 } }, // Query parameter { $set: { decade: "2010s" } }, // Update document { multi: true, hint: { year: 1 } } // Options )
Observação
Se você especificar um índice que não existe, a operação emitirá erros.
Para visualizar o índice utilizado, execute o explain na operação:
db.movies.explain().update( { title: "The Godfather", year: { $gte: 1970 } }, { $set: { test_hint_field: true } }, { hint: { year: 1 } } )
O db.collection.explain().update() não modifica os documentos.
Usar variáveis em let
Novidades na versão 5.0.
Para definir variáveis que você pode acessar em outro lugar no comando, use a opção let .
Observação
Para filtrar resultados usando uma variável, você deve acessar a variável dentro do operador $expr.
O exemplo:
Define duas variáveis na opção
let:targetTitle(definido como "A Matriz") enewTitle(definido como "A Matriz Recarregada")Usa
$exprno filtro de query para comparar o campotitledo documento com a variável$$targetTitleUtiliza um pipeline de agregação com
$setpara atualizar o campotitlepara o valor de$$newTitle
db.movies.update( { $expr: { $eq: [ "$title", "$$targetTitle" ] } }, [ { $set: { sequel: "$$sequelTitle" } } ], { let : { targetTitle: "The Matrix", sequelTitle: "The Matrix Reloaded" } } )
Substituir preocupação de gravação padrão
A operação a seguir para um conjunto de réplicas especifica uma preocupação de gravação de w: 2 com uma wtimeout de 5000 milissegundos. Essa operação retorna depois que a gravação se propaga para o primário e um secundário ou expira após 5 segundos.
db.movies.update( { num_mflix_comments: { $lte: 10 } }, { $set: { featured: true } }, { multi: true, writeConcern: { w: 2, j: true, wtimeout: 5000 } } )
A operação é concluída com êxito após a gravação ser confirmada pelo primário e pelo menos um secundário, conforme especificado por w: 2.
Erros de preocupação de gravação em clusters fragmentados
Alterado na versão 8.1.2.
Quando db.collection.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 db.collection.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.
Especifique o agrupamento
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:
collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
Ao especificar agrupamento, o campo locale é obrigatório; todos os outros campos de agrupamento são opcionais. Para obter descrições dos campos, consulte Documento de agrupamento.
Se o agrupamento não for especificado, mas a coleção tiver um agrupamento padrão (consulte db.createCollection()), a operação usará o agrupamento especificado para a coleção.
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.
Esta operação atualiza todos os filmes com títulos que começam com night e usa strength: 1 para comparação sem distinção entre maiúsculas e minúsculas:
db.movies.update( { title: /^night/i }, { $set: { updated: true } }, { collation: { locale: "en", strength: 1 }, multi: true } )