En MongoDB, cuando actualiza documentos que contienen matrices, tiene la opción de usar arrayFilters
parámetro.
Los arrayFilters
El parámetro le permite especificar una matriz de documentos de filtro que determinan qué elementos de la matriz modificar.
En el documento de actualización, use el $[<identifier>]
operador posicional filtrado, que identifica los elementos de la matriz que coinciden con los arrayFilters
condiciones para la operación de actualización.
Sintaxis
La sintaxis es así:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Entonces, por ejemplo, cuando se usa con updateMany()
método, es así:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Ejemplo
Supongamos que tenemos una colección llamada players
con los siguientes documentos:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Podríamos usar los arrayFilters
parámetro para actualizar solo aquellos elementos de la matriz que tienen un valor superior a una determinada cantidad.
Ejemplo:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultado:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
El mensaje nos dice que tres documentos fueron emparejados y modificados.
Así es como se ven los documentos ahora.
db.players.find()
Resultado:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Podemos ver que todos los valores que antes eran mayores o iguales a 10 ahora son 10.
En este caso, usé e
como el <identifier>
. Tenga en cuenta que el <identifier>
debe comenzar con una letra minúscula y contener solo caracteres alfanuméricos.