MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

In MongoDB die db.collection.findOneAndDelete() Methode löscht ein einzelnes Dokument und gibt das gelöschte Dokument zurück.

Es löscht das erste übereinstimmende Dokument in der Sammlung, das mit dem filter übereinstimmt . Die sort Parameter kann verwendet werden, um zu beeinflussen, welches Dokument gelöscht wird.

Die collection part ist der Name der Sammlung, aus der das Dokument gelöscht werden soll.

Beispiel

Angenommen, wir haben eine Sammlung namens pets die folgende Dokumente enthält:

{ "_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" ] }

Wir können db.collection.findOneAndDelete() verwenden Methode, um eines dieser Dokumente zu löschen.

db.pets.findOneAndDelete(
   { "type": "Cat" }
)

Ergebnis:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

In diesem Fall habe ich eine Abfrage verwendet, um sie auf Katzen einzugrenzen. Nur eine Katze wurde gelöscht, obwohl es zwei Katzen in der Sammlung gibt.

Sehen wir uns die Sammlung an.

db.pets.find()

Ergebnis:

{ "_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" ] }

Wir können sehen, dass die erste Katze (Dokument 3) gelöscht wurde.

Eingebettete Dokumente

Wenn Sie Dokumente haben, die eingebettete Dokumente enthalten, können Sie die folgenden Methoden verwenden, um Daten in den eingebetteten Dokumenten abzufragen.

  • Punktnotation (z. B. field.nestedfield: <value> )
  • Verschachtelte Form (z. B. { field: { nestedfield: <value> } } ). Beachten Sie, dass diese Option erst ab MongoDB 4.4 verfügbar ist.

Hier ist ein Beispiel, das die Punktnotation verwendet, um innerhalb des eingebetteten Dokuments abzufragen.

db.pets.findOneAndDelete({ "specs.height": 400 })

Ergebnis:

{
	"_id" : 6,
	"name" : "Fetch",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Wie erwartet wurde Dokument 6 gelöscht.

Die folgende Abfrage löscht dasselbe Dokument, aber in diesem Fall verwendet sie eine verschachtelte Form, um auf das eingebettete Dokument zu verweisen.

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 })

Bei Verwendung des verschachtelten Formulars muss die Abfrage genau mit dem gesamten eingebetteten Dokument übereinstimmen. Die folgende Abfrage stimmt beispielsweise nicht überein:

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400
	}
 })

Ergebnis:

null

Arrays

Sie können Daten in Arrays referenzieren, indem Sie das Array-Element über seinen Index oder seinen Wert referenzieren.

Wenn wir alle Hunde mit der Top-Hund-Auszeichnung löschen wollten, könnten wir die folgende Abfrage schreiben (die den obigen Hund zurückgibt).

db.pets.findOneAndDelete({ 
    "awards": "Top Dog"
})

Ergebnis:

{
	"_id" : 7,
	"name" : "Jake",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

Sie können den Elementindex auch wie folgt angeben:

db.pets.findOneAndDelete({ 
    "awards.0": "Top Dog"
})

Dazu muss sich der angegebene Wert am angegebenen Index befinden. Daher gibt die folgende Abfrage nicht denselben Hund zurück.

db.pets.findOneAndDelete({ 
    "awards.1": "Top Dog"
})

Beachten Sie, dass Arrays nullbasiert sind, sodass ein Index von 0 das erste Element angibt, 1 das zweite Element und so weiter.

Die sort Parameter

Sie können die sort verwenden -Parameter, um eine Sortierreihenfolge für die Dokumente anzugeben, die mit dem filter übereinstimmen . Dies beeinflusst, welches Dokument gelöscht wird.

Bei Verwendung der sort Parameter, ein Wert von 1 sortiert die Dokumente in aufsteigender Reihenfolge und einen Wert von -1 sortiert sie in absteigender Reihenfolge.

Das Argument muss als Dokument vorgelegt werden. Beispiel:{ sort: { "salary": 1 } } sortiert nach salary Feld in aufsteigender Reihenfolge.

Angenommen, wir erstellen eine Sammlung mit dem Namen employees mit folgenden Dokumenten:

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 }
    ])

Wir könnten den folgenden Code ausführen, um Dokumente mit einem Gehalt von weniger als 60000 zu finden, und dann das niedrigste dieser Dokumente löschen.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": 1 }
    }
)

Ergebnis:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Wie erwartet wurde der Mitarbeiter mit dem niedrigsten Gehalt gelöscht.

So sehen die Dokumente jetzt aus.

db.employees.find()

Ergebnis:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Wir können also sehen, dass Fritz gelöscht wurde.

Stellen wir es wieder auf das Originaldokument zurück.

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 }
    ])

Lassen Sie uns nun dasselbe findOneAndDelete() ausführen code erneut, aber diesmal sortieren wir ihn in absteigender Reihenfolge.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": -1 }
    }
)

Ergebnis:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Diesmal wurde Sandy gelöscht.

Sehen wir uns die Sammlung noch einmal an.

db.employees.find()

Ergebnis:

{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Wie erwartet ist Sandy nicht mehr in der Sammlung.

Weitere Informationen

Die db.collection.findOneAndDelete() -Methode akzeptiert auch andere Parameter wie projection (um eine Teilmenge der zurückzugebenden Felder anzugeben), maxTimeMS , und sort .

Weitere Informationen finden Sie in der MongoDB-Dokumentation.