Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

atualizar

Nesta página

  • Definição
  • Sintaxe
  • Campos de comando
  • Controle de acesso
  • Comportamento
  • Exemplos
  • Saída
update

O comando update modifica documentos em uma collection. Um único comando update pode conter várias instruções de atualização.

Dica

Em mongosh, este comando também pode ser executado através dos métodos auxiliares updateOne(), updateMany(), replaceOne(), findOneAndReplace() e findOneAndUpdate() .

Os métodos auxiliares são convenientes 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 conveniência não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.

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
}
)

O comando utiliza os seguintes campos:

Campo
Tipo
Descrição
update
string
O nome da coleção de destino.
updates
variedade
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.
ordered
boleano
Opcional. Se true, então quando uma declaração de atualização falhar, retorne sem executar as declarações de atualização restantes. Se false, então quando uma atualização falhar, continue com as declarações de atualização restantes, se houver. O padrão é true.
maxTimeMS
número inteiro não negativo

Opcional.

Especifica um limite de tempo em milissegundos. Se você não especificar um valor para maxTimeMS, as operações não atingirão o tempo limite. Um valor 0 especifica explicitamente o comportamento ilimitado padrão.

O MongoDB encerra as operações que excedem o limite de tempo alocado usando o mesmo mecanismo de db.killOp(). O MongoDB só encerra uma operação em um de seus pontos de interrupção designados.

writeConcern
documento

Opcional. Um documento que expressa a write concern do comando update . Omite o uso da detecção de gravação padrã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.

bypassDocumentValidation
boleano
Opcional. Habilita o update para ignorar a validação do documento durante a operação. Isso permite atualizar documentos que não atendem aos requisitos de validação.
comment
qualquer

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 é:

{ <variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n> }

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 ($$) junto com o nome da variável no formato $$<variable_name>. Por exemplo: $$targetTotal.

Para obter um exemplo completo, consulte Usar variáveis na opção let ou no campo c .

Novidades na versão 5,0.

Cada elemento da matriz 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 find().

documento ou pipeline

As modificações a serem aplicadas. O valor pode ser:

Para obter detalhes, consulte Comportamento.

documento

Opcional. Você pode especificar c somente se u for um pipeline.

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 é:

{ <variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n> }

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 ($$) junto com o nome da variável no formato $$<variable_name>. Por exemplo: $$targetTotal.

Observação

Para usar uma variável para filtrar os resultados, você deve acessar a variável dentro do operador $expr.

Para obter um exemplo completo usando let e variáveis, consulte Usar variáveis em let opção ou campo c .

Novidades na versão 5,0.

boleano

Opcional. Quando true, update ou:

  • Cria um novo documento se nenhum documento corresponder a query. Para obter mais detalhes, consulte comportamento upsert.

  • Atualiza um único documento que corresponda a query.

Se upsert e multi forem verdadeiros e nenhum documento corresponder à consulta, a operação de atualização inserirá apenas um único documento.

Para evitar várias upserts, certifique-se de que o(s) campo(s) query seja(m) indexado(s) exclusivamente. Consulte Upsert com índice exclusivo para obter um exemplo.

O padrão é false, que não insere um novo documento quando nenhuma correspondência é encontrada.

multi
boleano

Opcional. Se true, atualiza todos os documentos que atendem aos critérios de consulta. Se false, limite a atualização a um documento que atenda aos critérios de consulta. O padrão é false.

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.

collation
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:

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

arrayFilters
variedade

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 upgrade, use o operador posicional filtrado $[<identifier>] para definir um identificador, que você então faz referência nos documentos do filtro de matriz. Você não pode ter um documento de filtro de matriz para um identificador se o identificador não estiver incluído no documento de atualização.

Observaçã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; entretanto, 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. Por exemplo, se a instrução de atualização incluir o identificador x (possivelmente várias vezes), você não poderá especificar o seguinte para arrayFilters que inclui 2 documentos de filtro separados para x:

// INVALID
[
{ "x.a": { $gt: 85 } },
{ "x.b": { $gt: 80 } }
]

No entanto, você pode especificar condições compostas no mesmo identificador em um único documento de filtro, como nos exemplos a seguir:

// Example 1
[
{ $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 2
[
{ $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 3
[
{ "x.a": { $gt: 85 }, "x.b": { $gt: 80 } }
]

Para obter exemplos, consulte Especificar arrayFilters para operações de atualização de array.

Documento ou string

Opcional. Um documento ou string que especifica o índice a ser 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 ocorrerá erros.

Para um exemplo, consulte Especificar hint para Operações de Atualização.

Novidades na versão 4.2.

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.

Em implantações executadas com authorization, o usuário deve ter acesso que inclua os seguintes privilégios:

  • update ação na(s) coleção(ões) especificada(s).

  • find ação na(s) coleção(ões) especificada(s).

  • insert ação na(s) coleção(ões) especificada(s).

O papel embutido readWrite fornece os privilégios exigidos.

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.

O campo u do campo de instruçã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 .

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, criar uma coleção members com os seguintes documentos:

db.members.insertMany( [
{ "_id" : 1, "member" : "Taylor", "status" : "pending", "points" : 1},
{ "_id" : 2, "member" : "Alexis", "status" : "enrolled", "points" : 59},
{ "_id" : 3, "member" : "Elizabeth", "status" : "enrolled", "points" : 34}
] )

A operação seguinte cria um validador de documento na coleção members com uma regra que o valor points não pode ser igual a 60.

db.runCommand( {
collMod: "members",
validator: { points: { $ne: 60 } }
} )

Este comando de atualização aumenta o campo points de cada documento em 1.

db.runCommand(
{
update: "members",
updates: [
{
q: {},
u: { $inc: { points: 1 } },
multi: true
}
]
}
)

Após executar o comando, a coleção contém os seguintes documentos:

{ _id: 1, member: 'Taylor', status: 'A', points: 2 }
{ _id: 2, member: 'Alexis', status: 'D', points: 59 }
{ _id: 3, member: 'Elizabeth', status: 'C', points: 34 }

O comando update atualizou o valor points do primeiro documento, mas falhou ao atualizar o segundo documento devido à regra do validador de que o valor points não pode ser igual 60. O terceiro documento não foi atualizado porque nenhum outro documento foi atualizado após um erro de gravação.

Dica

Veja também:

A partir do MongoDB 4.2, o campo u do campo de instrução de atualização pode aceitar um aggregation pipeline [ <stage1>, <stage2>, ... ] que especifica as modificações a serem executadas. O pipeline pode consistir nas seguintes etapas:

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

O $set e o $unset usados no pipeline referem-se aos estágios de aggregation $set e $unset, respectivamente, e não aos operadores de atualização $set e $unset.

Para obter exemplos, consulte Atualizar com o aggregation pipeline.

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 concluírem a fase de query antes que qualquer cliente insira dados com êxito e não houver nenhum índice único 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 apenas um documento seja criado. Com um índice único em vigor, as operações múltiplas update agora exibem o seguinte comportamento:

  • Exatamente uma operação update inserirá com êxito um novo documento.

  • Outras operações update atualizam o documento recém-inserido ou falham devido a uma colisão de chave exclusiva.

    Para que outras operações do update 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 duplicado.

    • A operação de atualização não é updateMany ou multi é 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
{ name : 1 }
db.people.updateOne(
{ name: "Andy" },
{ $inc: { score: 1 } },
{ upsert: true }
)
O campo score do documento correspondente é incrementado em 1.
{ name : 1 }
db.people.updateOne(
{ name: { $ne: "Joe" } },
{ $set: { name: "Andy" } },
{ upsert: true }
)
A operação falha porque modifica o campo no padrão de chave de índice único (name).
{ name : 1 }
db.people.updateOne(
{ name: "Andy", email: "andy@xyz.com" },
{ $set: { active: false } },
{ upsert: true }
)
A operação falha porque os campos de predicados de igualdade (name, email) não correspondem ao campo chave de índice (name).

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.

O comando update adiciona suporte para a opção bypassDocumentValidation , que permite a você ignorar a validação do documento ao inserir ou atualizar documentos em uma coleção com regras de validação.

Para utilizar 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 _id ou direcionar um único shard (por exemplo, incluindo a chave de shard).

  • Se você especificar upsert: true, o filtro q deverá incluir uma correspondência de igualdade na chave de shard.

    No entanto, os documento em uma collection fragmentada podem não ter os campo do fragmento. Para direcionar um documento que não tenha a chave de shard, você pode usar a null equality match 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

A partir do MongoDB 4.2, 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 consulta, ela tentará direcionar pelo documento de substituição.

Em versões anteriores, a operação tenta direcionar usando o documento de substituição.

A partir do MongoDB 4,2, você pode atualizar o valor da chave do fragmento de um documento, a menos que o campo da chave do fragmento seja o campo imutável _id. No MongoDB 4.2 e anterior, o valor de campo chave de fragmento de um documento é imutável.

Para modificar o valor chave do fragmento existente com update:

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 upsert em uma collection fragmentada.

Os documentos em uma collection fragmentada podem não ter os campos de chave de shard. Para usar o update para definir a chave de shard ausente do documento, você deve executar em um mongos. Não emita a operação diretamente no shard.

Além disso, os seguintes requisitos também se aplicam:

Tarefa
Requisitos
Para definir como null
  • Pode especificar multi: true.

  • Exige filtro de equivalência na chave de fragmento completa se upsert: true for especificado.

Para definir um valor diferente denull:
  • Deve ser executado dentro de uma transação ou como uma retryable write.

  • Deve especificar multi: false.

  • Requer filtro de equivalência na chave de fragmento completa se:

    • upsert: true, ou

    • se usar um documento de substituição e o novo valor da chave de shard pertencer a um shard diferente.

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:

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.

Você pode criar collection e índices dentro de uma transação distribuída se a transação não for uma transação de escrita cross-shard.

update com upsert: true pode ser executado em uma coleção existente ou uma coleção não existente. Se for executada em uma coleção inexistente, a operação cria a coleçã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.

Use operadores de atualização para atualizar apenas os campos especificados de um documento.

Por exemplo, criar uma coleção members com os seguintes documentos:

db.members.insertMany([
{ _id: 1, member: "abc123", status: "Pending", points: 0, misc1: "note to self: confirm status", misc2: "Need to activate" },
{ _id: 2, member: "xyz123", status: "D", points: 59, misc1: "reminder: ping me at 100pts", misc2: "Some random comment" },
])

O comando a seguir usa os operadores de atualização $set e $inc para atualizar os campos status e points de um documento em que member é igual a "abc123":

db.runCommand(
{
update: "members",
updates: [
{
q: { member: "abc123" }, u: { $set: { status: "A" }, $inc: { points: 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 .

O documento retornado mostra que o comando encontrou e atualizou um único documento. O comando retorna:

{ "n" : 1, "nModified" : 1, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }

Consulte Saída para detalhes.

Após o comando, a coleção contém os seguintes documentos:

{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 1, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" }
{ "_id" : 2, "member" : "xyz123", "status" : "D", "points" : 59, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }

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, uma coleção members contém os seguintes documentos:

{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 1, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" }
{ "_id" : 2, "member" : "xyz123", "status" : "D", "points" : 59, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }

O comando a seguir usa os operadores de atualização $set e $inc para modificar os campos status e points, respectivamente, de todos os documentos na coleção:

db.runCommand(
{
update: "members",
updates: [
{ q: { }, u: { $set: { status: "A" }, $inc: { points: 1 } }, multi: true }
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

A atualização modifica todos os documentos que correspondem à consulta especificada no campo q, ou seja, a consulta vazia que corresponde a todos os documentos na coleção.

O documento retornado mostra que o comando encontrou e atualizou vários documentos. Para um conjunto de réplicas, o comando retorna:

{ "n" : 2, "nModified" : 2, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }

Consulte Saída para detalhes.

Após o comando, a coleção contém os seguintes documentos:

{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" }
{ "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }

A partir do MongoDB 4.2, o comando update pode usar um pipeline de agregação para a atualização. O pipeline pode consistir nas seguintes etapas:

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

Os exemplos a seguir usam o aggregation pipeline para modificar um campo usando os valores de outros campos no documento.

Uma coleção members contém os seguintes documentos:

{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" }
{ "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }

Suponha que, ao invés de separar os campos misc1 e misc2 , você deseja reuni-los em um novo campo comments. A operação de atualização seguinte utiliza um pipeline de agregação para adicionar o novo campo comments e remover os campos misc1 e misc2 para todos os documentos na coleção.

  • Primeiro, defina o campo status como "Modified" e adicione um novo campo comments que contenha o conteúdo atual de dois outros campos misc1 e misc2.

  • Em segundo lugar, remova os campos misc1 e misc2.

db.runCommand(
{
update: "members",
updates: [
{
q: { },
u: [
{ $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } },
{ $unset: [ "misc1", "misc2" ] }
],
multi: true
}
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

Observação

O $set e o $unset usados no pipeline referem-se aos estágios de aggregation $set e $unset, respectivamente, e não aos operadores de atualização $set e $unset.

O documento retornado mostra que o comando encontrou e atualizou vários documentos. O comando retorna:

{ "n" : 2, "nModified" : 2, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }

Consulte Saída para detalhes.

Após o comando, a coleção contém os seguintes documentos:

{ "_id" : 1, "member" : "abc123", "status" : "Modified", "points" : 2, "comments" : [ "note to self: confirm status", "Need to activate" ] }
{ "_id" : 2, "member" : "xyz123", "status" : "Modified", "points" : 60, "comments" : [ "reminder: ping me at 100pts", "Some random comment" ] }

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.

db.students.insertMany( [
{ "_id" : 1, "tests" : [ 95, 92, 90 ] },
{ "_id" : 2, "tests" : [ 94, 88, 90 ] },
{ "_id" : 3, "tests" : [ 70, 75, 82 ] }
] );

Usando um aggregation pipeline, você pode atualizar os documentos com a média calculada e a nota por letra.

db.runCommand(
{
update: "students",
updates: [
{
q: { },
u: [
{ $set: { average : { $avg: "$tests" } } },
{ $set: { grade: { $switch: {
branches: [
{ case: { $gte: [ "$average", 90 ] }, then: "A" },
{ case: { $gte: [ "$average", 80 ] }, then: "B" },
{ case: { $gte: [ "$average", 70 ] }, then: "C" },
{ case: { $gte: [ "$average", 60 ] }, then: "D" }
],
default: "F"
} } } }
],
multi: true
}
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

Observação

O $set usado no pipeline refere-se ao estágio de aggregation $set, e não aos operadores de atualização $set.

Primeira etapa
O estágio $set calcula um novo campo average com base na média do campo tests. Consulte $avg para obter mais informações sobre o operador de agregação $avg.
Segunda etapa
O estágio $set calcula um novo campo grade com base no campo average calculado no estágio anterior. Consulte $switch para obter mais informações sobre o operador de aggregation do $switch.

O documento retornado mostra que o comando encontrou e atualizou vários documentos. O comando retorna:

{ "n" : 3, "nModified" : 3, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }

Após o comando, a coleção contém os seguintes documentos:

{ "_id" : 1, "tests" : [ 95, 92, 90 ], "average" : 92.33333333333333, "grade" : "A" }
{ "_id" : 2, "tests" : [ 94, 88, 90 ], "average" : 90.66666666666667, "grade" : "A" }
{ "_id" : 3, "tests" : [ 70, 75, 82 ], "average" : 75.66666666666667, "grade" : "C" }

O seguinte exemplo executa múltiplas operações de atualização na coleção members:

db.runCommand(
{
update: "members",
updates: [
{ q: { status: "P" }, u: { $set: { status: "D" } }, multi: true },
{ q: { _id: 5 }, u: { _id: 5, name: "abc123", status: "A" }, upsert: true }
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

O documento retornado mostra que o comando modificou 10 documentos e inseriu um documento com o valor _id 5. Consulte Saída para detalhes.

{
"ok" : 1,
"nModified" : 10,
"n" : 11,
"upserted" : [
{
"index" : 1,
"_id" : 5
}
]
}

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.

Uma coleção myColl possui os seguintes documentos:

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

A seguinte operação inclui a opção coleção:

db.runCommand({
update: "myColl",
updates: [
{ q: { category: "cafe", status: "a" }, u: { $set: { status: "Updated" } }, collation: { locale: "fr", strength: 1 } }
]
})

A partir do MongoDB 3,6, ao atualizar um campo de array, você pode especificar arrayFilters que determina quais elementos da array devem ser atualizados.

Crie uma collection students com os seguintes documentos:

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
] );

Para modificar todos os elementos que são maiores ou iguais a 100 na matriz grades, utilize o operador posicional filtrado $[<identifier>] com a opção arrayFilters:

db.runCommand( {
update: "students",
updates: [
{ q: { grades: { $gte: 100 } }, u: { $set: { "grades.$[element]" : 100 } }, arrayFilters: [ { "element": { $gte: 100 } } ], multi: true}
]
} )

Após a operação, a coleção contém os seguintes documentos:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }

Crie uma collection students2 com os seguintes documentos:

db.students2.insertMany( [
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 90, "std" : 4 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
},
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}
] )

Para modificar o valor do campo mean para todos os elementos da array grades onde a nota é maior ou igual a 85, use o operador posicional filtrado com $[<identifier>] o arrayFilters

db.runCommand({
update: "students2",
updates: [
{ q: { }, u: { $set: { "grades.$[elem].mean" : 100 } }, arrayFilters: [ { "elem.grade": { $gte: 85 } } ], multi: true }
]
})

Após a operação, a coleção conta com os seguintes documentos:

{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 100, "std" : 4 },
{ "grade" : 85, "mean" : 100, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 100, "std" : 6 },
{ "grade" : 87, "mean" : 100, "std" : 3 },
{ "grade" : 85, "mean" : 100, "std" : 4 }
]
}

Novidades na versão 4.2.

Criar uma coleção members de amostra com os seguintes documentos:

db.members.insertMany([
{ "_id" : 1, "member" : "abc123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" },
{ "_id" : 3, "member" : "lmn123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 4, "member" : "pqr123", "status" : "D", "points" : 20, "misc1" : "Deactivated", "misc2" : null },
{ "_id" : 5, "member" : "ijk123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 6, "member" : "cde123", "status" : "A", "points" : 86, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
])

Crie os seguintes índices na coleção:

db.members.createIndex( { status: 1 } )
db.members.createIndex( { points: 1 } )

A seguinte operação de atualização sugere explicitamente o uso do índice { status: 1 }:

Observação

Se você especificar um índice que não existe, a operação ocorrerá erros.

db.runCommand({
update: "members",
updates: [
{ q: { "points": { $lte: 20 }, "status": "P" }, u: { $set: { "misc1": "Need to activate" } }, hint: { status: 1 }, multi: true }
]
})

O comando de atualização retorna o seguinte:

{ "n" : 3, "nModified" : 3, "ok" : 1 }

Para visualizar o índice utilizado, execute o explain na operação:

db.runCommand(
{
explain: {
update: "members",
updates: [
{ q: { "points": { $lte: 20 }, "status": "P" }, u: { $set: { "misc1": "Need to activate" } }, hint: { status: 1 }, multi: true }
]
},
verbosity: "queryPlanner"
}
)

O explain não modifica os documentos.

Novidades na versão 5,0.

As variáveis podem ser definidas na opção let ou no campo c e acessadas na matriz updates .

Observação

Para filtrar resultados usando uma variável, você deve acessar a variável dentro do operador $expr.

Criar uma coleção cakeFlavors:

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

O exemplo seguinte define targetFlavor e newFlavor variáveis no let e utiliza as variáveis para alterar o sabor do bolo de cereja para laranja:

db.runCommand( {
update: db.cakeFlavors.getName(),
updates: [
{ q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
u: [ { $set: { flavor: "$$newFlavor" } } ] }
],
let : { targetFlavor: "cherry", newFlavor: "orange" }
} )

O exemplo a seguir define targetFlavor e newFlavor variáveis em c e usa as variáveis para alterar o sabor do bolo de chocolate para baunilha:

db.runCommand( {
update: db.cakeFlavors.getName(),
updates: [
{ q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
u: [ { $set: { flavor: "$$newFlavor" } } ],
c: { targetFlavor: "chocolate", newFlavor: "vanilla" } }
]
} )

O documento devolvido contém um subconjunto dos seguintes campos:

update.ok

O status do comando.

update.n

Um comando update aceita uma matriz de atualizações de documentos, algumas das quais podem ser upserts. Para uma atualização, n indica o número de documentos selecionados para a atualização. Para um upsert, n é 1 para o documento inserido. O servidor adiciona os valores de n para todas as atualizações e upserts e retorna o total como update.n.

Se uma operação de atualização não resultar em nenhuma alteração no documento, por exemplo, a expressão $set atualizará o valor para o valor atual, n poderá ser maior que nModified.

update.nModified

O 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 para seu valor atual, nModified pode ser menor que n.

update.upserted

Uma matriz 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.upserted.index

Um número inteiro que identifica a atualização com upsert:true instrução na matriz updates , que usa um índice baseado em zero.

update.upserted._id

O valor de _id do documento adicionado.

update.writeErrors

Uma matriz de documentos que contém informações sobre qualquer erro encontrado durante a operação de atualização. A matriz writeErrors contém um documento de erro para cada instrução de atualização que apresenta erros.

Cada documento de erro contém os seguintes campos:

update.writeErrors.index

Um número inteiro que identifica a declaração de atualização na matriz updates, que utiliza um índice baseado em zero.

update.writeErrors.code

Um valor inteiro identificando o erro.

update.writeErrors.errmsg

Uma descrição do erro.

update.writeConcernError

Documento que descreve o erro relacionado ao write concern e contém o campo:

update.writeConcernError.code

Um valor inteiro que identifica a causa do erro de write concern.

update.writeConcernError.errmsg

Uma descrição da causa do erro de write concern.

update.writeConcernError.errInfo.writeConcern

O 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.provenance

Um 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ência
Descrição
clientSupplied
A preocupação de escrita foi especificada no aplicativo.
customDefault
A write concern originou-se de um valor padrão personalizado definido. Consulte setDefaultRWConcern.
getLastErrorDefaults
A write concern originada do campo settings.getLastErrorDefaults do conjunto de réplicas.
implicitDefault
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.

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, $clusterTime e operationTime.

  • para clusters fragmentados: operationTime e $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}."
},
]
}
← Redefinir erro