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