Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

findAndModify (comando de banco de dados)

findAndModify

Atualiza e retorna um único documento. Por padrão, o documento retornado não inclui as modificações feitas pela atualização. Para retornar o documento modificado, use a opção new.

Dica

In mongosh, this command can also be run through the db.collection.findAndModify() helper method.

Helper methods are convenient for mongosh users, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.

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

Alterado na versão 5.0.

O comando tem a seguinte sintaxe:

db.runCommand(
{
findAndModify: <collection-name>,
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document or aggregation pipeline>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
maxTimeMS: <integer>,
collation: <document>,
arrayFilters: <array>,
hint: <document|string>,
comment: <any>,
let: <document> // Added in MongoDB 5.0
}
)

O comando utiliza os seguintes campos:

Campo
Tipo
Descrição

query

documento

Optional. The selection criteria for the modification. The query field employs the same query selectors as used in the db.collection.find() method. Although the query may match multiple documents, findAndModify selects only one document to update.

Se não for especificado, o padrão será um documento vazio.

Se o argumento de consulta não for um documento, a operação será executada.

sort

documento

Optional. Determines which document the operation updates if the query selects multiple documents. findAndModify updates the first document in the sort order specified by this argument.

Se o argumento de classificação não for um documento, ocorrerá um erro com a operação.

O MongoDB não armazena documentos em uma collection em uma ordem específica. Ao ordenar em um campo que contém valores duplicados, os documentos que contêm esses valores podem ser retornados em qualquer ordem.

Se desejar uma ordem de classificação consistente, inclua pelo menos um campo em sua ordenação que contenha valores exclusivos. A maneira mais fácil de garantir isso é incluir o campo _id em sua query de ordenação.

Consulte Consistência de classificação para obter mais informações.

remove

booleano

Deve especificar o campo remove ou update. Remove o documento especificado no campo query. Define como true para remover o documento selecionado. O padrão é false.

update

documento ou array

Deve especificar o campo remove ou update. Executa uma atualização do documento selecionado.

new

booleano

Opcional. Quando true, retorna o documento atualizado em vez do original. O padrão é false.

fields

documento

Opcional. Um subconjunto de campos para retornar. O documento fields especifica uma inclusão de um campo com 1, como em: fields: { <field1>: 1, <field2>: 1, ... }. Consulte projeção.

Se o argumento dos campos não for um documento, ocorrerá um erro com a operação.

upsert

booleano

Opcional. Usado em conjunto com o campo update.

When true, findAndModify either:

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

Para evitar várias upserts, certifique-se de que os campos de query sejam indexados de forma exclusiva. 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.

bypassDocumentValidation

booleano

Optional. Enables findAndModify to bypass schema validation during the operation. This lets you update documents that do not meet the validation requirements.

writeConcern

documento

Opcional. Especifica a write concern. Omitir para usar a write concern 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.

maxTimeMS

non-negative integer

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.

findAndModify

string

A collection contra a qual executar o comando.

collation

documento

Opcional.

Opcional. Especifica a agrupamento para utilizar 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.

arrayFilters

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 $[<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; entretanto, para cada identificador distinto ($[identifier]) no documento de atualização, você deve especificar exatamente um documento de filtro de array correspondente. Ou seja, não é possível especificar vários documentos de filtro de array 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 } }
]

For examples, see Array Update Operations with arrayFilters.

arrayFilters não está disponível para atualizações que usam um pipeline de agregação

hint

documento ou string

Opcional. Um documento ou string que especifica o índice para utilizar para suportar o 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.

For an example, see Specify hint for findAndModify Operations.

comment

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

{
<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 usar uma variável para filtrar os resultados, você deve acessar a variável dentro do operador $expr.

For a complete example using let and variables, see Use Variables in let.

Novidade na versão 5.0.

The findAndModify command returns a document with the following fields:

Campo
Tipo
Descrição

value

documento

Contains the command's returned value. See value for details.

lastErrorObject

documento

Contains information about updated documents. See lastErrorObject for details.

ok

número

Contém o status de execução da comando. 1 em caso de sucesso ou 0 se ocorrer um erro.

O documento incorporado do lastErrorObject contém os seguintes campos:

Campo
Tipo
Descrição

updatedExisting

booleano

Contém true se uma operação do update:

  • Atualizou um documento existente.

  • Encontrado o documento, mas ele já estava no estado de destino desejado, então nenhuma atualização realmente ocorreu.

upserted

documento

Contém o ObjectId do documento inserido se uma operação do update com upsert: true resultou em um novo documento.

Para operações do remove, o value contém o documento removido se a query corresponder a um documento. Se a query não corresponder a um documento para remover, value conterá null.

Para operações do update, o documento embutido do value contém o seguinte:

  • Se o parâmetro new não estiver configurado ou for false:

    • o documento de pré-modificação se a query corresponder a um documento;

    • caso contrário, null.

  • Se new for true:

    • o documento atualizado se a query retornar uma correspondência;

    • o documento inserido se upsert: true e nenhum documento corresponder à query;

    • caso contrário, null.

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(
{
findAndModify: "people",
query: { name: "Andy" },
update: { $inc: { score: 1 } },
upsert: true
}
)

If all findAndModify operations finish the query phase before any client successfully inserts data, and there is no unique index on the name field, each findAndModify operation may result in an insert, creating multiple documents with name: Andy.

A unique index on the name field ensures that only one document is created. With a unique index in place, the multiple findAndModify operations now exhibit the following behavior:

  • Exactly one findAndModify operation will successfully insert a new document.

  • Other findAndModify operations either update the newly-inserted document or fail due to a unique key collision.

    In order for other findAndModify operations to update the newly-inserted document, all of the following conditions must be met:

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

To use findAndModify on a sharded collection:

  • Se você só tiver como alvo um shard, pode usar uma chave de shard parcial no campo query ou,

  • Você pode fornecer uma condição de igualdade em uma chave de shard completa no campo query.

Documentos em uma coleção fragmentada podem estar faltando os campos de chave de estilhaço. Para direcionar um documento que não tenha a chave de fragmento, você pode usar a correspondência de igualdade null 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

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.

Aviso

Os documentos em coleções fragmentadas podem não ter os campos chave de fragmentado. Tome cuidado para evitar remover acidentalmente a chave de fragmento ao alterar o valor dela em um documento.

To update the existing shard key value with findAndModify:

  • Você deve executar em um mongos. Não execute a operação diretamente no shard.

  • Você deve executar em uma transação ou como uma gravação repetível.

  • Você deve incluir um filtro de igualdade na chave de shard completa.

Documents in a sharded collection can be missing the shard key fields. To use findAndModify to set the document's missing shard key:

  • Você deve executar em um mongos. Não execute a operação diretamente no shard.

  • Você deve executar em uma transação ou como retryable write se o novo valor da chave de shard não for null.

  • Você deve incluir um filtro de igualdade na chave de shard 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.

Veja também:

The findAndModify command adds support for the bypassDocumentValidation option, which lets you bypass schema validation when inserting or updating documents in a collection with validation rules.

When updating a document, findAndModify and the updateOne() method operate differently:

  • If multiple documents match the update criteria, for findAndModify, you can specify a sort to provide some measure of control on which document to update.

    updateOne() atualiza o primeiro documento que corresponde.

  • By default, findAndModify returns an object that contains the pre-modified version of the document, as well as the status of the operation. To obtain the updated document, use the new option.

    O método updateOne() retorna um objeto WriteResult() que contém o status da operação.

    Para retornar o documento atualizado, use o método find(). No entanto, outras atualizações podem ter modificado o documento entre a atualização e a recuperação do documento. Além disso, se a atualização modificou apenas um único documento, mas vários documentos corresponderam, você precisará usar lógica adicional para identificar o documento atualizado.

When modifying a single document, both findAndModify and the updateOne() method atomically update the document. See Atomicity and Transactions for more details about interactions and order of operations of these methods.

findAndModify can be used inside distributed transactions.

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

findAndModify with upsert: true can be run on an existing collection or a non-existing collection. If run on a non-existing collection, the operation creates the collection.

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.

Se uma operação findAndModify falhar porque a preocupação de gravação não foi executada, a operação retornará um writeConcernError documento.

O comando a seguir atualiza um documento existente na collection people onde o documento corresponde aos critérios do query:

db.runCommand(
{
findAndModify: "people",
query: { name: "Tom", state: "active", rating: { $gt: 10 } },
sort: { rating: 1 },
update: { $inc: { score: 1 } }
}
)

Este comando executa as seguintes ações:

  1. A query localiza um documento na collection people onde o campo name tem o valor Tom, o campo state tem o valor active e o campo rating tem um valor greater than 10.

  2. O sort ordena os resultados da query em ordem crescente. Se vários documentos corresponderem à condição query, o comando modificará o primeiro documento na ordem de classificação.

  3. O update increments o valor do campo score por 1.

  4. O comando retorna um documento com os seguintes campos:

    • O campo lastErrorObject que contém os detalhes do comando, incluindo o campo updatedExisting que é true, e

    • O campo value que contém o documento de pré-modificação original selecionado para esta atualização:

      {
      "lastErrorObject" : {
      "connectionId" : 1,
      "updatedExisting" : true,
      "n" : 1,
      "syncMillis" : 0,
      "writtenTo" : null,
      "err" : null,
      "ok" : 1
      },
      value" : {
      "_id" : ObjectId("54f62d2885e4be1f982b9c9c"),
      "name" : "Tom",
      "state" : "active",
      "rating" : 100,
      "score" : 5
      },
      "ok" : 1
      }

Para retornar o documento atualizado no campo value , adicione a opção new:true ao comando.

Se nenhum documento corresponder à condição query, o comando retornará um documento que contenha null no campo value:

{ "value" : null, "ok" : 1 }

mongosh and many drivers provide a findAndModify() helper method. Using the shell helper, this previous operation can take the following form:

db.people.findAndModify( {
query: { name: "Tom", state: "active", rating: { $gt: 10 } },
sort: { rating: 1 },
update: { $inc: { score: 1 } }
} );

No entanto, o assistente de shell findAndModify() retorna somente o documento não modificado ou, se new for true, o documento atualizado.

{
"_id" : ObjectId("54f62d2885e4be1f982b9c9c"),
"name" : "Tom",
"state" : "active",
"rating" : 100,
"score" : 5
}

O comando a seguir usa upsert: true para atualizar um documento correspondente ou inserir um novo se não houver correspondência:

db.runCommand(
{
findAndModify: "people",
query: { name: "Gus", state: "active", rating: 100 },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true
}
)

Se o comando encontrar um documento correspondente, o comando executará uma atualização.

Se o comando não encontrar um documento correspondente, a operação update com upsert: true resultará em uma inserção e retornará um documento com os seguintes campos:

  • O campo lastErrorObject que contém os detalhes do comando, incluindo o campo upserted que contém o valor _id do documento recém-inserido e

  • O campo value contendo null.

{
"value" : null,
"lastErrorObject" : {
"updatedExisting" : false,
"n" : 1,
"upserted" : ObjectId("54f62c8bc85d4472eadea26f")
},
"ok" : 1
}

O comando a seguir usa upsert: true e new: true para atualizar um documento correspondente ou inserir um novo, e retorna o documento novo ou atualizado no campo value.

No exemplo a seguir, nenhum documento na collection people corresponde à condição query:

db.runCommand(
{
findAndModify: "people",
query: { name: "Pascal", state: "active", rating: 25 },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true,
new: true
}
)

O comando retorna o documento recém-inserido no campo value:

{
"lastErrorObject" : {
"connectionId" : 1,
"updatedExisting" : false,
"upserted" : ObjectId("54f62bbfc85d4472eadea26d"),
"n" : 1,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
},
"value" : {
"_id" : ObjectId("54f62bbfc85d4472eadea26d"),
"name" : "Pascal",
"rating" : 25,
"state" : "active",
"score" : 1
},
"ok" : 1
}

Ao incluir uma especificação sort no campo rating, o exemplo seguinte remove da collection people um único documento com o valor state de active e o menor rating entre os documentos correspondentes:

db.runCommand(
{
findAndModify: "people",
query: { state: "active" },
sort: { rating: 1 },
remove: true
}
)

O comando retorna o documento excluído:

{
"lastErrorObject" : {
"connectionId" : 1,
"n" : 1,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
},
"value" : {
"_id" : ObjectId("54f62a6785e4be1f982b9c9b"),
"name" : "XYZ123",
"score" : 1,
"state" : "active",
"rating" : 3
},
"ok" : 1
}

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(
{
findAndModify: "myColl",
query: { category: "cafe", status: "a" },
sort: { category: 1 },
update: { $set: { status: "Updated" } },
collation: { locale: "fr", strength: 1 }
}
)

A operação retorna o seguinte documento:

{
"lastErrorObject" : {
"updatedExisting" : true,
"n" : 1
},
"value" : {
"_id" : 1,
"category" : "café",
"status" : "A"
},
"ok" : 1
}

Observação

arrayFilters não está disponível para atualizações que usam um pipeline de agregação

Ao atualizar um campo de array, você pode especificar arrayFilters que determinam quais elementos de array atualizar.

Observação

arrayFilters não está disponível para atualizações que usam um pipeline de agregação

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 atualizar todos os elementos que são maiores ou iguais a 100 na array grades , utilize o operador posicional $[<identifier>] com a opção arrayFilters :

db.runCommand(
{
findAndModify: "students",
query: { grades: { $gte: 100 } },
update: { $set: { "grades.$[element]" : 100 } },
arrayFilters: [ { "element": { $gte: 100 } } ]
}
)

A operação atualiza o campo grades para um único documento e, após a operação, a collection tem os seguintes documentos:

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

Observação

arrayFilters não está disponível para atualizações que usam um pipeline de agregação

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

A operação a seguir localiza um documento em que o campo _id é igual a 1 e usa o operador posicional filtrado $[<identifier>] com arrayFilters para atualizar o mean para todos os elementos na array grades onde a nota é maior maior ou igual a 85.

db.runCommand(
{
findAndModify: "students2",
query: { _id : 1 },
update: { $set: { "grades.$[elem].mean" : 100 } },
arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
}
)

A operação atualiza o campo grades para um único documento e, após a operação, a collection tem 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" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}

findAndModify pode aceitar um pipeline de agregação para a atualização. O pipeline pode consistir nas seguintes etapas:

O uso do pipeline de agregação permite uma declaração de atualização mais expressiva, como expressar atualizações condicionais com base em valores de campo atuais ou atualizar um campo usando o valor de outro campo.

Por exemplo, criar 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 }
]
}
] )

A operação a seguir localiza um documento em que o campo _id é igual a 1 e usa um aggregation pipeline para calcular um novo total de campo a partir do campo grades:

db.runCommand(
{
findAndModify: "students2",
query: { "_id" : 1 },
update: [ { $set: { "total" : { $sum: "$grades.grade" } } } ],
new: true
}
)

Observação

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

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" : 90, "std" : 4 }, { "grade" : 85, "mean" :85, "std" : 6 } ],
"total" : 250
}
{
"_id" : 2,
"grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85,"std" : 4 } ]
}

In mongosh, create a members collection with the following documents:

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 operação a seguir sugere explicitamente o uso do índice { status: 1 }:

db.runCommand({
findAndModify: "members",
query: { "points": { $lte: 20 }, "status": "P" },
remove: true,
hint: { status: 1 }
})

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.runCommand(
{
explain: {
findAndModify: "members",
query: { "points": { $lte: 20 }, "status": "P" },
remove: true,
hint: { status: 1 }
},
verbosity: "queryPlanner"
}
)

Novidade na versão 5.0.

Para definir variáveis que você possa 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.

Criar uma coleção cakeFlavors:

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

O exemplo a seguir define uma variável targetFlavor em let e usa a variável para alterar o sabor do bolo de cereja para laranja:

db.cakeFlavors.runCommand( {
findAndModify: db.cakeFlavors.getName(),
query: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
update: { flavor: "orange" },
let: { targetFlavor: "cherry" }
} )