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