En MongoDB, puede usar $pull
operador para eliminar valores de una matriz.
Usa $pull
junto con un método como update()
para actualizar el documento especificado con el cambio.
Ejemplo
Supongamos que tenemos una colección llamada products
con los siguientes documentos:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Podemos eliminar un elemento de la matriz en el documento 1 de esta manera:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
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.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Podemos ver que la matriz en el documento 1 ha tenido su valor XXL
eliminado como se especifica.
Eliminar varios valores
Podemos usar el $in
operador para especificar varios valores que queremos eliminar de la matriz.
Ejemplo:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ahora revisemos la colección nuevamente:
db.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Podemos ver que los dos elementos especificados se han eliminado de la matriz en el documento 3.
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.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Salida:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
En este caso, podemos ver que coincidieron tres documentos (porque hay tres documentos en la colección), pero solo se modificaron dos (porque solo dos tenían el valor XL
en los sizes
matriz).
Y vuelva a comprobar la colección:
db.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Podemos ver que todas las instancias de XL
se han eliminado de todos los documentos de la colección.
Matriz de documentos
Si tiene una matriz que contiene documentos como sus elementos, puede eliminar cualquiera de esos documentos especificando criterios que coincidan con los datos dentro del documento.
Supongamos que tenemos una colección llamada restaurantes que contiene los siguientes documentos:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
En este caso, el campo llamado reviews
contiene una serie de documentos. Cada documento es una reseña diferente del restaurante en cuestión.
Podríamos usar $pull
para eliminar reseñas que coincidan con ciertos criterios.
Ejemplo:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Salida:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Este mensaje nos dice que tres documentos coincidieron con los criterios de consulta (porque seleccionamos todos los documentos) y dos documentos se modificaron (porque dos coincidieron con nuestro $pull
criterios).
Revisemos la colección nuevamente para ver el efecto:
db.restaurants.find().pretty()
Resultado:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Podemos ver que solo quedan reseñas con una calificación de 4 o más. Se han eliminado todas las reseñas de menos de 4.