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.