sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

V MongoDB db.collection.findOneAndDelete() metoda odstraní jeden dokument a vrátí odstraněný dokument.

Odstraní první odpovídající dokument v kolekci, který odpovídá filter . sort Parametr lze použít k ovlivnění toho, který dokument bude odstraněn.

collection část je název kolekce, ze které se má dokument odstranit.

Příklad

Předpokládejme, že máme sbírku nazvanou pets který obsahuje následující dokumenty:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

Můžeme použít db.collection.findOneAndDelete() způsob odstranění jednoho z těchto dokumentů.

db.pets.findOneAndDelete(
   { "type": "Cat" }
)

Výsledek:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

V tomto případě jsem použil dotaz, abych to zúžil pouze na kočky. Byla smazána pouze jedna kočka, i když ve sbírce jsou dvě kočky.

Podívejme se na sbírku.

db.pets.find()

Výsledek:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

Vidíme, že první kočka (dokument 3) byla smazána.

Vložené dokumenty

Pokud máte dokumenty, které obsahují vložené dokumenty, můžete k dotazování na data ve vložených dokumentech použít následující metody.

  • Tečkový zápis (např. field.nestedfield: <value> )
  • Vnořený formulář (např. { field: { nestedfield: <value> } } ). Všimněte si, že tato možnost je dostupná pouze od MongoDB 4.4.

Zde je příklad, který používá tečkovou notaci k dotazování v rámci vloženého dokumentu.

db.pets.findOneAndDelete({ "specs.height": 400 })

Výsledek:

{
	"_id" : 6,
	"name" : "Fetch",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Podle očekávání byl dokument 6 smazán.

Následující dotaz odstraní stejný dokument, ale v tomto případě používá vnořený formulář k odkazu na vložený dokument.

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 })

Při použití vnořeného formuláře se dotaz musí přesně shodovat s celým vloženým dokumentem. Například následující dotaz neodpovídá:

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400
	}
 })

Výsledek:

null

Pole

Na data v polích můžete odkazovat odkazováním na prvek pole podle jeho indexu nebo podle jeho hodnoty.

Pokud bychom chtěli smazat všechny psy s oceněním Top Dog, mohli bychom napsat následující dotaz (který vrátí výše uvedeného psa).

db.pets.findOneAndDelete({ 
    "awards": "Top Dog"
})

Výsledek:

{
	"_id" : 7,
	"name" : "Jake",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

Můžete také zadat index prvku takto:

db.pets.findOneAndDelete({ 
    "awards.0": "Top Dog"
})

To vyžaduje, aby zadaná hodnota byla na zadaném indexu. Proto následující dotaz nevrátí stejného psa.

db.pets.findOneAndDelete({ 
    "awards.1": "Top Dog"
})

Všimněte si, že pole jsou založena na nule, takže index 0 určuje první prvek, 1 určuje druhý prvek a tak dále.

sort Parametr

Můžete použít sort parametr k určení pořadí řazení pro dokumenty odpovídající filter . To ovlivní, který dokument bude odstraněn.

Při použití sort parametr, hodnota 1 seřadí dokumenty ve vzestupném pořadí a na hodnotu -1 seřadí je v sestupném pořadí.

Argument je třeba poskytnout jako dokument. Například { sort: { "salary": 1 } } seřadí podle salary pole ve vzestupném pořadí.

Předpokládejme například, že vytvoříme kolekci nazvanou employees s následujícími dokumenty:

db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Mohli bychom spustit následující kód, abychom našli dokumenty s platem nižším než 60 000, a pak smazali ten, který je z těchto dokumentů nejnižší.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": 1 }
    }
)

Výsledek:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Podle očekávání byl smazán zaměstnanec s nejnižší mzdou.

Takto nyní dokumenty vypadají.

db.employees.find()

Výsledek:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Takže vidíme, že Fritz byl smazán.

Vraťme to zpět k původnímu dokumentu.

db.employees.remove({})
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Nyní spustíme stejné findOneAndDelete() kód znovu, ale tentokrát jej seřadíme v sestupném pořadí.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": -1 }
    }
)

Výsledek:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Tentokrát byla Sandy smazána.

Podívejme se znovu na sbírku.

db.employees.find()

Výsledek:

{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Jak se očekávalo, Sandy již není ve sbírce.

Další informace

db.collection.findOneAndDelete() metoda také přijímá další parametry, jako je projection (pro určení podmnožiny polí, která se mají vrátit), maxTimeMS a sort .

Další informace naleznete v dokumentaci MongoDB.


  1. Jak mohu přihlásit své dotazy v MongoDB C# Driver 2.0?

  2. Proč má Redis funkce Pub/Sub?

  3. Jak chránit pole hesla v Mongoose/MongoDB, aby se nevrátilo v dotazu, když vyplním kolekce?

  4. Zapouzdření Unicode od redis