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

MongoDB findOneAndReplace()

В MongoDB db.collection.findOneAndReplace() метод заменя един документ въз основа на посочения филтър.

collection part е името на колекцията, с която да се извърши операцията.

Пример

Да предположим, че имаме колекция, наречена pets който съдържа следните документи:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Можем да използваме db.collection.findOneAndReplace() метод за замяна на един от тези документи.

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "name": "Bruno", "type" : "Horse" }
)

Резултат:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }

По подразбиране той връща оригиналния документ (не модифицираната версия).

Имайте предвид, че само едно куче беше актуализирано, въпреки че в колекцията има две кучета.

Нека проверим колекцията.

db.pets.find()

Резултат:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Виждаме, че първият документ е заменен с новия.

Имайте предвид, че заместващият документ не може да посочи _id стойност, която се различава от _id стойност в подменения документ.

Върнете модифицирания документ

По подразбиране оригиналният документ се връща, когато използвате db.collection.findOneAndReplace() .

Ако предпочитате вместо това да върнете модифицирания документ, използвайте returnNewDocument параметър.

Нека направим още една модификация, но този път ще използваме returnNewDocument: true .

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Резултат:

{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }

Този път другото куче беше актуализирано. В този случай направихме по-значителна промяна и можем да видим, че документът за връщане отразява това.

Можем да проверим колекцията отново, за да видим подменения документ.

db.pets.find()

Резултат:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Нагоре

Upsert е опция, която можете да използвате при операции за актуализиране. Ако посоченият документ не съществува, се добавя нов. Ако го прави съществува, тогава оригиналният документ се актуализира (и не е вмъкнат документ).

Можете да извършвате upserts, като посочите upsert: true .

Пример за използване на upsert: false

Първо, ето пример за опит за актуализиране на несъществуващ документ, когато upsert: false .

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       returnNewDocument: true
    }
)

Резултат:

null

Документът не съществуваше в колекцията и затова findOneAndReplace() върна null . Въпреки че не сме посочили изрично upsert: false , знаем, че е фалшиво, защото това е стойността по подразбиране (т.е. това е стойността, която се използва, когато не посочите опция upsert).

Ако хвърлим още един поглед в колекцията, ще видим, че документът не е бил внесен.

db.pets.find()

Резултат:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Пример за използване на upsert: true

Ето го отново, но този път указваме upsert: true .

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       upsert: true,
       returnNewDocument: true
    }
)

Резултат:

{
	"_id" : 4,
	"name" : "Fluffy",
	"type" : "Pooch",
	"DOB" : "2019-12-03",
	"points" : 20
}

Този път се въвежда нов документ и ние виждаме въведения документ като изход (защото сме посочили returnNewDocument: true ).

Нека проверим колекцията отново.

db.pets.find()

Резултат:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }

Така че можем да видим, че новият документ всъщност е бил въведен.

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.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       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" : 3, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Така че можем да видим, че Фриц е заменен от Флъфи, който има много по-добра заплата.

Нека го върнем обратно към оригиналния документ.

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

Сега нека изпълним същия findOneAndReplace() код отново, но този път ще го сортираме в низходящ ред.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": -1 }
    }
)

Резултат:

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

Този път Санди беше заменен.

Нека проверим колекцията отново.

db.employees.find()

Резултат:

{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 }
{ "_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.findOneAndReplace() Методът приема и други параметри, като projection (за да посочите подмножество от полета за връщане), maxTimeMS и collation .

Вижте документацията на MongoDB за db.collections.findOneAndReplace() за повече информация.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Мониторинг на база данни без агент с ClusterControl

  2. SQL NULLIF() Обяснено

  3. Как да извършвам заявка от Mongoose pre hook в приложение Node.js / Express?

  4. добавяне на полета created_at и updated_at към схемите на mongoose

  5. Как да използвам $elemMatch върху проекцията на агрегата?