MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $tira

In MongoDB, puoi usare $pull per rimuovere i valori da un array.

Usa $pull insieme a un metodo come update() per aggiornare il documento specificato con la modifica.

Esempio

Supponiamo di avere una collezione chiamata products con i seguenti documenti:

{ "_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" ] }

Possiamo rimuovere un elemento dall'array nel documento 1 in questo modo:

db.products.update( 
  { _id: 1 }, 
  { $pull: { sizes: "XXL" } } 
)

Uscita:

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

Quel messaggio ci dice che un documento corrispondeva e uno (cioè lo stesso documento) è stato modificato.

Diamo un'occhiata alla collezione ora:

db.products.find()

Risultato:

{ "_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" ] }

Possiamo vedere che l'array nel documento 1 ha avuto il suo valore XXL rimosso come specificato.

Rimuovi più valori

Possiamo usare il $in per specificare più valori che vogliamo rimuovere dall'array.

Esempio:

db.products.update( 
  { _id: 3 }, 
  { $pull: { sizes: { $in: ["XS", "XL"] } } } 
)

Uscita:

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

Ora controlliamo di nuovo la collezione:

db.products.find()

Risultato:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Possiamo vedere che i due elementi specificati sono stati rimossi dall'array nel documento 3.

Aggiorna tutti i documenti

Puoi aggiungere multi: true oppure usa updateMany() metodo per aggiornare tutti i documenti che soddisfano i criteri.

Quando si esegue questa operazione, rimuovere tutti i criteri di selezione dal primo documento di query (che specifica quale/i documento/i aggiornare). In altre parole, usa un documento vuoto come primo argomento per update() (o updateMany() ) metodo.

Esempio:

db.products.update( 
  { }, 
  { $pull: { sizes: "XL" } },
  { multi: true }
)

Uscita:

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

In questo caso, possiamo vedere che tre documenti corrispondevano (perché nella collezione ci sono tre documenti), ma solo due sono stati modificati (perché solo due avevano il valore XL nelle sizes matrice).

E ricontrolla la collezione:

db.products.find()

Risultato:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Possiamo vedere che tutte le istanze di XL sono stati rimossi da tutti i documenti della raccolta.

Matrice di documenti

Se hai una matrice che contiene documenti come elementi, puoi rimuovere uno qualsiasi di questi documenti specificando criteri che corrispondono ai dati all'interno del documento.

Supponiamo di avere una collezione chiamata ristoranti che documenta:

{
	"_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
		}
	]
}

In questo caso, il campo chiamato reviews contiene una serie di documenti. Ogni documento è una recensione diversa del ristorante in questione.

Potremmo usare $pull per rimuovere le recensioni che soddisfano determinati criteri.

Esempio:

db.restaurants.update(
  { },
  { $pull: { reviews: { rating: { $lt: 4 } } } },
  { multi: true }
)

Uscita:

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

Questo messaggio ci dice che tre documenti corrispondevano ai criteri di ricerca (perché abbiamo selezionato tutti i documenti) e due documenti sono stati modificati (perché due corrispondevano al nostro $pull criteri).

Controlliamo di nuovo la collezione per vedere l'effetto:

db.restaurants.find().pretty()

Risultato:

{ "_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
		}
	]
}

Possiamo vedere che rimangono solo le recensioni con una valutazione di 4 e oltre. Tutte le recensioni inferiori a 4 sono state rimosse.