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.