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.