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

MongoDB $extracción

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.