Menu Docs

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

$[]

Nesta página

  • Definição
  • Comportamento
  • Exemplos
$[]

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

Para ver um exemplo, consulte Atualizar todos os elementos em uma 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.

Para ver um exemplo, consulte Atualizar matrizes agrupadas em conjunto com $[<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 ] }
] )

Para incrementar todos os elementos na array grades por 10 para todos os documentos da collection, use o operador posicional all $[] :

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

O operador posicional all $[] atua como um espaço reservado para todos os elementos no campo de array.

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

O operador posicional $[] facilita as atualizações de arrays que contêm documentos incorporados. Para acessar os campos nos documentos incorporados, use a notação de ponto com o operador $[] .

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

Para modificar o valor do campo std para todos os elementos na array grades , utilize o operador posicional $[] :

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

Para incrementar todos os elementos na array grades por 10 para todos os documentos, exceto aqueles com o valor 100 na array grades , use o operador posicional all $[] :

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

O operador posicional all $[] atua como um espaço reservado para todos os elementos no campo de array.

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

Dica

Veja também:

← $ (atualização)