sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

I MongoDB används db.collection.findOneAndDelete() metod tar bort ett enskilt dokument och returnerar det raderade dokumentet.

Det tar bort det första matchande dokumentet i samlingen som matchar filter . sort parameter kan användas för att påverka vilket dokument som raderas.

collection del är namnet på samlingen som dokumentet ska raderas från.

Exempel

Anta att vi har en samling som heter pets som innehåller följande dokument:

{ "_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 använda db.collection.findOneAndDelete() metod för att ta bort ett av dessa dokument.

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

Resultat:

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

I det här fallet använde jag en fråga för att begränsa den till bara katter. Endast en katt raderades, trots att det finns två katter i samlingen.

Låt oss kolla in 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 att den första katten (dokument 3) har raderats.

Inbäddade dokument

Om du har dokument som innehåller inbäddade dokument kan du använda följande metoder för att söka efter data i de inbäddade dokumenten.

  • Pricknotation (t.ex. field.nestedfield: <value> )
  • Inkapslad form (t.ex. { field: { nestedfield: <value> } } ). Observera att det här alternativet endast är tillgängligt från MongoDB 4.4.

Här är ett exempel som använder punktnotation för att fråga i det inbäddade dokumentet.

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

Resultat:

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

Som väntat togs dokument 6 bort.

Följande fråga tar bort samma dokument, men i det här fallet använder den kapslad form för att referera till det inbäddade dokumentet.

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

När du använder det kapslade formuläret måste frågan matcha hela det inbäddade dokumentet exakt. Till exempel stämmer inte följande fråga:

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

Resultat:

null

Arrayer

Du kan referera till data i matriser genom att referera till matriselementet efter dess index eller dess värde.

Om vi ​​ville ta bort alla hundar med Top Dog-utmärkelsen kunde vi skriva följande fråga (som kommer att returnera ovanstående hund).

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

Resultat:

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

Du kan också ange elementindex, så här:

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

Att göra det kräver att det angivna värdet är vid det angivna indexet. Följande fråga returnerar därför inte samma hund.

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

Observera att arrayer är nollbaserade, så ett index på 0 anger det första elementet, 1 anger det andra elementet och så vidare.

sort Parameter

Du kan använda sort parameter för att ange en sorteringsordning för dokumenten som matchas av filter . Detta kommer att påverka vilket dokument som raderas.

När du använder sort parameter, ett värde på 1 sorterar dokumenten i stigande ordning och värdet -1 sorterar dem i fallande ordning.

Argumentet måste tillhandahållas som ett dokument. Till exempel, { sort: { "salary": 1 } } sorterar efter salary fältet i stigande ordning.

Anta till exempel att vi skapar en samling som heter employees med följande dokument:

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 kan köra följande kod för att hitta dokument med en lön på mindre än 60 000 och sedan ta bort den som är lägst av dessa dokument.

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

Resultat:

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

Som väntat raderades den anställde med lägst lön.

Så här ser dokumenten ut 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 att Fritz har tagits bort.

Låt oss återställa det till originaldokumentet.

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

Låt oss nu köra samma findOneAndDelete() kod igen, men den här gången sorterar vi den i fallande ordning.

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

Resultat:

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

Den här gången togs Sandy bort.

Låt oss kolla in 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 }

Som väntat finns Sandy inte längre i samlingen.

Mer information

db.collection.findOneAndDelete() Metoden accepterar även andra parametrar, såsom projection (för att ange en delmängd av fält att returnera), maxTimeMS och collation .

Se MongoDB-dokumentationen för mer information.


  1. Frågar MongoDB att matcha i det första objektet i en array

  2. Definiera ett Mongoose-schema i farten från en JSON-formaterad "beskrivning"

  3. Behöver jag uttryckligen stänga anslutningen?

  4. Hur lägger man in en bildfil i ett json-objekt?