В MongoDB db.collection.findOneAndDelete() метод изтрива един документ и връща изтрития документ.
Той изтрива първия съвпадащ документ в колекцията, който съответства на filter . sort параметърът може да се използва, за да повлияе кой документ да бъде изтрит.
collection part е името на колекцията, от която да изтриете документа.
Пример
Да предположим, че имаме колекция, наречена pets който съдържа следните документи:
{ "_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" ] }
Можем да използваме db.collection.findOneAndDelete() метод за изтриване на един от тези документи.
db.pets.findOneAndDelete(
{ "type": "Cat" }
) Резултат:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } В този случай използвах заявка, за да я стесня само до котки. Само една котка беше изтрита, въпреки че в колекцията има две котки.
Нека проверим колекцията.
db.pets.find() Резултат:
{ "_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" ] } Виждаме, че първата котка (документ 3) е изтрита.
Вградени документи
Ако имате документи, които съдържат вградени документи, можете да използвате следните методи за запитване на данни във вградените документи.
- Точкова нотация (напр.
field.nestedfield: <value>) - Вложена форма (напр. {
field: { nestedfield: <value> } }). Имайте предвид, че тази опция е достъпна само от MongoDB 4.4.
Ето пример, който използва нотация с точки за заявка във вградения документ.
db.pets.findOneAndDelete({ "specs.height": 400 }) Резултат:
{
"_id" : 6,
"name" : "Fetch",
"type" : "Dog",
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
} Както се очакваше, документ 6 беше изтрит.
Следната заявка изтрива същия документ, но в този случай използва вложена форма за препратка към вградения документ.
db.pets.findOneAndDelete({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
}) Когато използвате вложения формуляр, заявката трябва да съвпада точно с целия вграден документ. Например следната заявка не съвпада:
db.pets.findOneAndDelete({
"specs" : {
"height" : 400
}
}) Резултат:
null
Масиви
Можете да препращате данни в масиви, като препращате елемента от масива по неговия индекс или по неговата стойност.
Ако искаме да изтрием всички кучета с наградата Top Dog, бихме могли да напишем следната заявка (която ще върне горното куче).
db.pets.findOneAndDelete({
"awards": "Top Dog"
}) Резултат:
{
"_id" : 7,
"name" : "Jake",
"type" : "Dog",
"awards" : [
"Top Dog",
"Best Dog",
"Biggest Dog"
]
} Можете също да посочите индекса на елемента, както следва:
db.pets.findOneAndDelete({
"awards.0": "Top Dog"
}) Това изисква посочената стойност да е в посочения индекс. Следователно следната заявка не връща същото куче.
db.pets.findOneAndDelete({
"awards.1": "Top Dog"
}) Обърнете внимание, че масивите са базирани на нула, така че индекс 0 определя първия елемент, 1 определя втория елемент и т.н.
sort Параметър
Можете да използвате sort параметър, за да посочите реда на сортиране на документите, съответстващи на filter . Това ще повлияе кой документ ще бъде изтрит.
Когато използвате sort параметър, стойност на 1 сортира документите във възходящ ред и стойност -1 сортира ги в низходящ ред.
Аргументът трябва да бъде представен като документ. Например, { sort: { "salary": 1 } } сортира по salary поле във възходящ ред.
Например, да предположим, че създаваме колекция, наречена employees със следните документи:
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 }
]) Можем да изпълним следния код, за да намерим документи със заплата по-малка от 60 000, след което да изтрием най-ниския от тези документи.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": 1 }
}
) Резултат:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } Както се очакваше, служителят с най-ниска заплата беше заличен.
Ето как изглеждат документите сега.
db.employees.find() Резултат:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 } Така че можем да видим, че Fritz е изтрит.
Нека го върнем обратно към оригиналния документ.
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 }
])
Сега нека изпълним същия findOneAndDelete() код отново, но този път ще го сортираме в низходящ ред.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": -1 }
}
) Резултат:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } Този път Санди беше изтрита.
Нека проверим колекцията отново.
db.employees.find() Резултат:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 } Както се очакваше, Санди вече не е в колекцията.
Повече информация
db.collection.findOneAndDelete() Методът приема и други параметри, като projection (за да посочите подмножество от полета за връщане), maxTimeMS и collation .
Вижте документацията на MongoDB за повече информация.