MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо посоката на индекса има значение в MongoDB?

  2. Многократно използване на позиционния оператор `$` за актуализиране на вложени масиви

  3. Как да премахна документи с помощта на Node.js Mongoose?

  4. Пролетни данни MongoDb:MappingMongoConverter премахва _class

  5. MongoDb c# драйвер за намиране на елемент в масив по стойност на полето