MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

$pull . MongoDB

W MongoDB możesz użyć $pull operator do usuwania wartości z tablicy.

Użyj $pull w połączeniu z metodą taką jak update() aby zaktualizować określony dokument ze zmianą.

Przykład

Załóżmy, że mamy kolekcję o nazwie products z następującymi dokumentami:

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

Możemy usunąć element z tablicy w dokumencie 1 w ten sposób:

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

Wyjście:

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

Ta wiadomość mówi nam, że jeden dokument pasował, a jeden (tj. ten sam dokument) został zmodyfikowany.

Przyjrzyjmy się teraz kolekcji:

db.products.find()

Wynik:

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

Widzimy, że tablica w dokumencie 1 miała wartość XXL usunięte zgodnie z opisem.

Usuń wiele wartości

Możemy użyć $in operatora, aby określić wiele wartości, które chcemy usunąć z tablicy.

Przykład:

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

Wyjście:

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

Teraz ponownie sprawdźmy kolekcję:

db.products.find()

Wynik:

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

Widzimy, że dwa określone elementy zostały usunięte z tablicy w dokumencie 3.

Aktualizuj wszystkie dokumenty

Możesz dodać multi: true lub użyj updateMany() metoda aktualizacji wszystkich dokumentów, które spełniają kryteria.

Gdy to zrobisz, usuń wszystkie kryteria wyboru z pierwszego dokumentu zapytania (który określa, które dokumenty do zaktualizowania). Innymi słowy, użyj pustego dokumentu jako pierwszego argumentu funkcji update() (lub updateMany() ).

Przykład:

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

Wyjście:

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

W tym przypadku widzimy, że pasowały trzy dokumenty (ponieważ w kolekcji są trzy dokumenty), ale tylko dwa zostały zmodyfikowane (ponieważ tylko dwa miały wartość XL w sizes tablica).

I ponownie sprawdź kolekcję:

db.products.find()

Wynik:

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

Widzimy, że wszystkie wystąpienia XL zostały usunięte ze wszystkich dokumentów w kolekcji.

Tablica dokumentów

Jeśli masz tablicę zawierającą dokumenty jako swoje elementy, możesz usunąć dowolny z tych dokumentów, określając kryteria, które pasują do danych w dokumencie.

Załóżmy, że mamy kolekcję o nazwie restauracje, która zawiera następujące dokumenty:

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

W tym przypadku pole o nazwie reviews zawiera szereg dokumentów. Każdy dokument jest inną recenzją danej restauracji.

Moglibyśmy użyć $pull aby usunąć opinie spełniające określone kryteria.

Przykład:

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

Wyjście:

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

Ta wiadomość mówi nam, że trzy dokumenty pasowały do ​​kryteriów zapytania (ponieważ wybraliśmy wszystkie dokumenty), a dwa dokumenty zostały zmodyfikowane (ponieważ dwa pasowały do ​​naszego $pull kryteria).

Sprawdźmy ponownie kolekcję, aby zobaczyć efekt:

db.restaurants.find().pretty()

Wynik:

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

Widzimy, że pozostały tylko recenzje z oceną 4 i wyższą. Wszystkie recenzje mniej niż 4 zostały usunięte.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak wykonać zapytanie tablicowe identyfikatorów w Mongoose?

  2. Jak zaktualizować wartość konkretnego osadzonego dokumentu, wewnątrz tablicy, określonego dokumentu w MongoDB?

  3. Importuj dokumenty do MongoDB z tablicy dokumentów JSON

  4. Wyszukiwanie agregacji Mongodb z warunkami

  5. Wdrażanie MongoDB za pomocą Docker