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

MongoDB $pullAll

En MongoDB, puede usar $pullAll operador para eliminar todas las instancias de los valores especificados de una matriz existente.

Usa $pullAll junto con un método como update() , updateOne() , o updateMany() para actualizar los documentos especificados con el cambio.

Ejemplo

Supongamos que tenemos una colección con los siguientes documentos:

{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

Y digamos que queremos eliminar todos los valores de 7 de la matriz en el documento 1.

Podemos hacer esto:

db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: [ 7 ] } } 
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ese mensaje nos dice que un documento coincidió y otro (es decir, el mismo documento) fue modificado.

Echemos un vistazo a la colección ahora:

db.foo.find()

Resultado:

{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

Podemos ver que la matriz en el documento 1 ha tenido todos sus 7 valores eliminados como se especifica.

Eliminar varios valores

El argumento que proporcionamos a $pullAll es una matriz, por lo que podemos eliminar varios valores separándolos con una coma.

Ejemplo:

db.foo.update( 
  { _id: 2 }, 
  { $pullAll: { bar: [ 17, 18 ] } } 
)

Salida:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ahora revisemos la colección nuevamente:

db.foo.find()

Resultado:

{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

Podemos ver que los valores 17 y 18 se han eliminado de la matriz en el documento 2.

Actualizar todos los documentos

Puedes agregar multi: true o use updateMany() para actualizar todos los documentos que coincidan con los criterios.

Cuando haga esto, elimine cualquier criterio de selección del primer documento de consulta (que especifica qué documento/s actualizar). En otras palabras, use un documento vacío como primer argumento para update() (o updateMany() ) método.

Ejemplo:

db.foo.update( 
  { }, 
  { $pullAll: { bar: [ 1, 8 ] } },
  { multi: true }
)

Salida:

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

En este caso, podemos ver que tres documentos coincidieron (porque hay tres documentos en la colección) y los tres se modificaron (porque todos contenían los valores especificados).

Revisemos la colección nuevamente:

db.foo.find()

Resultado:

{ "_id" : 1, "bar" : [ 2, 3 ] }
{ "_id" : 2, "bar" : [ 0 ] }
{ "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }

Podemos ver que todas las instancias se han actualizado según lo especificado.