В 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 за повече информация.