sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo funciona el parámetro arrayFilters en MongoDB

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.