I MongoDB er db.collection.findOneAndDelete()
metoden sletter et enkelt dokument og returnerer det slettede dokument.
Det sletter det første matchende dokument i samlingen, der matcher filter
. sort
parameter kan bruges til at påvirke hvilket dokument der slettes.
collection
del er navnet på den samling, som dokumentet skal slettes fra.
Eksempel
Antag, at vi har en samling kaldet pets
der indeholder følgende dokumenter:
{ "_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" ] }
Vi kan bruge db.collection.findOneAndDelete()
metode til at slette et af disse dokumenter.
db.pets.findOneAndDelete(
{ "type": "Cat" }
)
Resultat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
I dette tilfælde brugte jeg en forespørgsel til at indsnævre den til kun katte. Kun én kat blev slettet, selvom der er to katte i samlingen.
Lad os tjekke samlingen.
db.pets.find()
Resultat:
{ "_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" ] }
Vi kan se, at den første kat (dokument 3) er blevet slettet.
Indlejrede dokumenter
Hvis du har dokumenter, der indeholder indlejrede dokumenter, kan du bruge følgende metoder til at forespørge data i de indlejrede dokumenter.
- Priknotation (f.eks.
field.nestedfield: <value>
) - Indlejret form (f.eks. {
field: { nestedfield: <value> } }
). Bemærk, at denne mulighed kun er tilgængelig fra MongoDB 4.4.
Her er et eksempel, der bruger punktnotation til at forespørge i det indlejrede dokument.
db.pets.findOneAndDelete({ "specs.height": 400 })
Resultat:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
Som forventet blev dokument 6 slettet.
Følgende forespørgsel sletter det samme dokument, men i dette tilfælde bruger den indlejret form til at henvise til det indlejrede dokument.
db.pets.findOneAndDelete({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Når du bruger den indlejrede formular, skal forespørgslen matche hele det indlejrede dokument nøjagtigt. For eksempel stemmer følgende forespørgsel ikke:
db.pets.findOneAndDelete({
"specs" : {
"height" : 400
}
})
Resultat:
null
Arrays
Du kan referere til data i arrays ved at referere til array-elementet efter dets indeks eller efter dets værdi.
Hvis vi ønskede at slette alle hunde med Top Dog-prisen, kunne vi skrive følgende forespørgsel (som vil returnere ovenstående hund).
db.pets.findOneAndDelete({
"awards": "Top Dog"
})
Resultat:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Du kan også angive elementindekset på denne måde:
db.pets.findOneAndDelete({
"awards.0": "Top Dog"
})
At gøre det kræver, at den angivne værdi er ved det angivne indeks. Derfor returnerer følgende forespørgsel ikke den samme hund.
db.pets.findOneAndDelete({
"awards.1": "Top Dog"
})
Bemærk, at arrays er nul-baserede, så et indeks på 0 angiver det første element, 1 angiver det andet element, og så videre.
sort
Parameter
Du kan bruge sort
parameter for at angive en sorteringsrækkefølge for de dokumenter, der matches af filter
. Dette vil påvirke, hvilket dokument der slettes.
Når du bruger sort
parameter, en værdi på 1
sorterer dokumenterne i stigende rækkefølge og en værdi på -1
sorterer dem i faldende rækkefølge.
Argumentet skal leveres som et dokument. For eksempel { sort: { "salary": 1 } }
sorterer efter salary
felt i stigende rækkefølge.
Antag for eksempel, at vi opretter en samling kaldet employees
med følgende dokumenter:
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 }
])
Vi kunne køre følgende kode for at finde dokumenter med en løn på mindre end 60.000, og derefter slette den, der er den laveste af disse dokumenter.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": 1 }
}
)
Resultat:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Medarbejderen med den laveste løn blev som forventet slettet.
Sådan ser dokumenterne ud nu.
db.employees.find()
Resultat:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Så vi kan se, at Fritz er blevet slettet.
Lad os vende det tilbage til det originale dokument.
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 }
])
Lad os nu køre den samme findOneAndDelete()
kode igen, men denne gang sorterer vi den i faldende rækkefølge.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": -1 }
}
)
Resultat:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Denne gang blev Sandy slettet.
Lad os tjekke samlingen igen.
db.employees.find()
Resultat:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Sandy er som forventet ikke længere i samlingen.
Flere oplysninger
db.collection.findOneAndDelete()
metode accepterer også andre parametre, såsom projection
(for at angive et undersæt af felter, der skal returneres), maxTimeMS
, og collation
.
Se MongoDB-dokumentationen for mere information.