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

$[] (operador de atualização)

$[]

O operador posicional all $[] indica que o operador de atualização deve modificar todos os elementos no campo de array especificado.

O operador $[] tem o seguinte formato:

{ <update operator>: { "<array>.$[]" : value } }

Use em operações de atualização, por exemplo, db.collection.updateOne() e db.collection.findAndModify(), para modificar todos os elementos de array para o documento ou documentos que correspondem à condição de query. Por exemplo:

db.collection.updateOne(
{ <query conditions> },
{ <update operator>: { "<array>.$[]" : value } }
)

For an example, see Update All Elements in an Array.

A partir do MongoDB 5.0, os operadores de atualização processam campos de documento com nomes baseados em cadeia de caracteres em ordem lexicográfica. Os campos com nomes numéricos são processados em ordem numérica. Consulte Atualizar Comportamento de Operadores para detalhes.

Se uma operação upsert resultar em uma inserção, query deverá incluir uma correspondência de igualdade exata no campo de array para usar o operador posicional $[] na declaração de atualização.

Por exemplo, a seguinte operação de upsert, que utiliza $[] no documento de atualização, especifica uma condição exata de correspondência de igualdade no campo de array:

db.collection.updateOne(
{ myArray: [ 5, 8 ] },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

Se não existir tal documento, a operação resultará em uma inserção do seguinte documento:

{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] }

Se a operação upsert não incluísse uma correspondência de igualdade exata e nenhum documento correspondente fosse encontrado para atualizar, a operação upsert apresentaria erro.

Por exemplo, as seguintes operações apresentariam erro se nenhum documento correspondente fosse encontrado para atualização:

db.emptyCollection.updateOne(
{ },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)
db.emptyCollection.updateOne(
{ myArray: 5 },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

O operador $[] pode ser utilizado para queries que atravessam mais de uma array e arrays agrupadas.

For an example, see Update Nested Arrays in Conjunction with $[<identifier>].

Crie a coleção students:

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

To increment all elements in the grades array by 10 for all documents in the collection, use the all positional $[] operator:

db.students.updateMany(
{ },
{ $inc: { "grades.$[]": 10 } },
)

The all positional $[] operator acts as a placeholder for all elements in the array field.

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

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

The $[] positional operator facilitates updates to arrays that contain embedded documents. To access the fields in the embedded documents, use the dot notation with the $[] operator.

db.collection.updateOne(
{ <query selector> },
{ <update operator>: { "array.$[].field" : value } }
)

Crie a coleção students2:

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

To modify the value of the std field for all elements in the grades array, use the positional $[] operator:

db.students2.updateMany(
{ },
{ $inc: { "grades.$[].std" : -2 } },
)

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

Crie a coleção results:

db.results.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

To increment all elements in the grades array by 10 for all documents except those with the value 100 in the grades array, use the all positional $[] operator:

db.results.updateMany(
{ "grades" : { $ne: 100 } },
{ $inc: { "grades.$[]": 10 } },
)

The all positional $[] operator acts as a placeholder for all elements in the array field.

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

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

O operador posicional $[], em conjunto com o operador posicional de filtro $[<identifier>], pode ser usado para atualizar arrays agrupadas.

Crie uma collection students3 com os seguintes documentos:

db.students3.insertMany( [
{ "_id" : 1,
"grades" : [
{ type: "quiz", questions: [ 10, 8, 5 ] },
{ type: "quiz", questions: [ 8, 9, 6 ] },
{ type: "hw", questions: [ 5, 4, 3 ] },
{ type: "exam", questions: [ 25, 10, 23, 0 ] },
]
}
] )

Para atualizar todos os valores que são maiores ou iguais a 8 na array grades.questions agrupada, independentemente de type:

db.students3.updateMany(
{},
{ $inc: { "grades.$[].questions.$[score]": 2 } },
{ arrayFilters: [ { "score": { $gte: 8 } } ] }
)

Os documentos atualizados ficam assim:

{
_id: 1,
grades: [
{ type: 'quiz', questions: [ 12, 10, 5 ] },
{ type: 'quiz', questions: [ 10, 11, 6 ] },
{ type: 'hw', questions: [ 5, 4, 3 ] },
{ type: 'exam', questions: [ 27, 12, 25, 0 ] }
]
}

For examples that use the $[] operator to update arrays, see Update Array Elements with MQL Positional Operators.