sql >> Database >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

In MongoDB de db.collection.findOneAndDelete() methode verwijdert een enkel document en retourneert het verwijderde document.

Het verwijdert het eerste overeenkomende document in de verzameling dat overeenkomt met het filter . De sort parameter kan worden gebruikt om te beïnvloeden welk document wordt verwijderd.

De collection deel is de naam van de verzameling waaruit het document moet worden verwijderd.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets die de volgende documenten bevat:

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

We kunnen de db.collection.findOneAndDelete() . gebruiken methode om een ​​van die documenten te verwijderen.

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

Resultaat:

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

In dit geval heb ik een zoekopdracht gebruikt om het te beperken tot alleen katten. Slechts één kat is verwijderd, ook al zijn er twee katten in de collectie.

Laten we de collectie eens bekijken.

db.pets.find()

Resultaat:

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

We kunnen zien dat de eerste kat (document 3) is verwijderd.

Ingesloten documenten

Als u documenten heeft die ingesloten documenten bevatten, kunt u de volgende methoden gebruiken om gegevens in de ingesloten documenten op te vragen.

  • Puntnotatie (bijv. field.nestedfield: <value> )
  • Genest formulier (bijv. { field: { nestedfield: <value> } } ). Merk op dat deze optie alleen beschikbaar is vanaf MongoDB 4.4.

Hier is een voorbeeld dat puntnotatie gebruikt om te zoeken in het ingesloten document.

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

Resultaat:

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

Zoals verwacht is document 6 verwijderd.

Met de volgende query wordt hetzelfde document verwijderd, maar in dit geval wordt een geneste vorm gebruikt om naar het ingesloten document te verwijzen.

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

Bij gebruik van het geneste formulier moet de query exact overeenkomen met het hele ingesloten document. De volgende zoekopdracht komt bijvoorbeeld niet overeen:

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

Resultaat:

null

Arrays

U kunt naar gegevens in arrays verwijzen door naar het array-element te verwijzen met zijn index of zijn waarde.

Als we alle honden met de Top Dog-award wilden verwijderen, zouden we de volgende vraag kunnen schrijven (die de bovenstaande hond zal retourneren).

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

Resultaat:

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

U kunt de elementindex ook als volgt specificeren:

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

Om dat te doen, moet de opgegeven waarde zich in de opgegeven index bevinden. Daarom retourneert de volgende zoekopdracht niet dezelfde hond.

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

Merk op dat arrays op nul zijn gebaseerd, dus een index van 0 specificeert het eerste element, 1 specificeert het tweede element, enzovoort.

De sort Parameter

U kunt de sort . gebruiken parameter om een ​​sorteervolgorde op te geven voor de documenten die overeenkomen met het filter . Dit heeft invloed op welk document wordt verwijderd.

Bij gebruik van de sort parameter, een waarde van 1 sorteert de documenten in oplopende volgorde, en een waarde van -1 sorteert ze in aflopende volgorde.

Het argument moet als document worden aangeleverd. Bijvoorbeeld { sort: { "salary": 1 } } sorteert op salary veld in oplopende volgorde.

Stel dat we bijvoorbeeld een verzameling maken met de naam employees met de volgende documenten:

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

We kunnen de volgende code uitvoeren om documenten te vinden met een salaris van minder dan 60000, en dan de laagste van die documenten verwijderen.

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

Resultaat:

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

Zoals verwacht is de medewerker met het laagste salaris geschrapt.

Zo zien de documenten er nu uit.

db.employees.find()

Resultaat:

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

Dus we kunnen zien dat Fritz is verwijderd.

Laten we het terugzetten naar het originele document.

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

Laten we nu dezelfde findOneAndDelete() . uitvoeren code opnieuw, maar deze keer sorteren we het in aflopende volgorde.

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

Resultaat:

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

Deze keer is Sandy verwijderd.

Laten we de collectie nog eens bekijken.

db.employees.find()

Resultaat:

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

Zoals verwacht zit Sandy niet meer in de collectie.

Meer informatie

De db.collection.findOneAndDelete() methode accepteert ook andere parameters, zoals projection (om een ​​subset van te retourneren velden te specificeren), maxTimeMS , en collation .

Zie de MongoDB-documentatie voor meer informatie.


  1. Controleer of MongoDB upsert een invoeging of een update heeft uitgevoerd

  2. Een structuur voor aggregatie genereren

  3. Redis:Kan .rdb niet openen voor opslaan:Toestemming geweigerd

  4. MongoDB-groep en som met id als sleutel