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

MongoDB $træk

I MongoDB kan du bruge $pull operator for at fjerne værdier fra et array.

Brug $pull i forbindelse med en metode såsom update() for at opdatere det angivne dokument med ændringen.

Eksempel

Antag, at vi har en samling kaldet products med følgende dokumenter:

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

Vi kan fjerne et element fra arrayet i dokument 1 på denne måde:

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

Output:

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

Den meddelelse fortæller os, at et dokument matchede, og et (dvs. det samme dokument) blev ændret.

Lad os tage et kig på kollektionen nu:

db.products.find()

Resultat:

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

Vi kan se, at arrayet i dokument 1 har haft sin værdi XXL fjernet som angivet.

Fjern flere værdier

Vi kan bruge $in operator for at angive flere værdier, som vi ønsker at fjerne fra arrayet.

Eksempel:

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

Output:

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

Lad os nu tjekke samlingen igen:

db.products.find()

Resultat:

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

Vi kan se, at de to specificerede elementer er blevet fjernet fra arrayet i dokument 3.

Opdater alle dokumenter

Du kan tilføje multi: true eller brug updateMany() metode til at opdatere alle dokumenter, der matcher kriterierne.

Når du gør dette, skal du fjerne eventuelle udvælgelseskriterier fra det første forespørgselsdokument (der angiver, hvilke dokumenter der skal opdateres). Med andre ord, brug et tomt dokument som det første argument til update() (eller updateMany() ) metode.

Eksempel:

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

Output:

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

I dette tilfælde kan vi se, at tre dokumenter matchede (fordi der er tre dokumenter i samlingen), men kun to blev ændret (fordi kun to havde værdien XL i sizes array).

Og tjek samlingen igen:

db.products.find()

Resultat:

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

Vi kan se, at alle forekomster af XL er blevet fjernet fra alle dokumenter i samlingen.

Vifte af dokumenter

Hvis du har et array, der indeholder dokumenter som deres elementer, kan du fjerne et hvilket som helst af disse dokumenter ved at angive kriterier, der matcher data i dokumentet.

Antag, at vi har en samling kaldet restauranter, som følgende dokumenterer:

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

I dette tilfælde er feltet kaldet reviews indeholder en række dokumenter. Hvert dokument er en anden anmeldelse af den pågældende restaurant.

Vi kunne bruge $pull for at fjerne anmeldelser, der matcher et bestemt kriterium.

Eksempel:

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

Output:

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

Denne meddelelse fortæller os, at tre dokumenter matchede forespørgselskriterierne (fordi vi valgte alle dokumenter), og to dokumenter blev ændret (fordi to matchede vores $pull kriterier).

Lad os tjekke samlingen igen for at se effekten:

db.restaurants.find().pretty()

Resultat:

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

Vi kan se, at kun anmeldelser med en vurdering på 4 og derover er tilbage. Alle anmeldelser mindre end 4 er blevet fjernet.


  1. Opdater dokumenter i MongoDB

  2. Kort-Reducer ydeevne i MongoDb 2.2, 2.4 og 2.6

  3. Sådan sletter du N antal dokumenter i mongodb

  4. Sådan gør du:Scan Salted Apache HBase-tabeller med regionsspecifikke nøgleområder i MapReduce