MongoDB предоставя различни начини за актуализиране на документ. Методът, който използвате, ще зависи от това как точно искате да извършите актуализацията.
Тази статия представя 4 начина за актуализиране на документ в MongoDB.
db.collection.updateOne()
Метод
db.collection.updateOne()
методът прави точно както обещава името му – актуализира един документ.
Да предположим, че имаме колекция, наречена pets
който съдържа следните документи:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Бихме могли да актуализираме един документ по следния начин:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Резултат:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Това актуализира само един документ, въпреки че два документа отговарят на критериите за филтриране (критериите са type: "Dog"
).
Можем да проверим резултатите по следния начин:
db.pets.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Първият документ вече има type
на Cow
вместо Dog
, но вторият документ не беше засегнат, въпреки че също отговаряше на критериите за филтриране.
db.collection.updateMany()
Метод
db.collection.updateMany()
метод актуализира всички документи, които съответстват на посочения филтър за колекция.
Нека използваме оригиналните документи за събиране:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Още веднъж можем да видим, че два документа имат Dog
като техен type
.
Можем да актуализираме и двата документа наведнъж по следния начин:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Резултат:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Това ни показва, че два документа съвпадат и два са актуализирани.
Можем да проверим колекцията:
db.pets.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.update()
Метод
db.collection.update()
метод може да актуализира един или няколко документа в колекция.
По подразбиране актуализира само един документ. Но ако multi: true
е посочено, след което актуализира всички документи, които отговарят на критериите за заявка.
Актуализиране на един документ
Нека отново използваме оригиналната колекция от документи:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Бихме могли да актуализираме един документ по следния начин:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Резултат:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Само един документ беше актуализиран. Това се потвърждава, когато правим заявка за колекцията.
db.pets.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Актуализиране на няколко документа
Да се върнем отново към оригиналната колекция от документи:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
И сега ще добавим multi: true
към нашата операция за актуализиране, за да актуализираме всички документи, които отговарят на критериите за заявка:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Резултат:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Така два документа бяха съпоставени и актуализирани този път.
Нека отново да разгледаме нашата колекция:
db.pets.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Както се очакваше, и двата документа вече имат type
на Cow
.
db.collection.replaceOne()
Метод
db.collection.replaceOne()
метод заменя един документ в колекцията въз основа на филтъра.
Отново използвайки оригиналната колекция:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Нека видим какво се случва, когато използваме db.collection.replaceOne()
метод срещу него.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Резултат:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Един документ бе актуализиран.
Нека да разгледаме.
db.pets.find()
Резултат:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Този път целият документ беше заменен с новия документ (с изключение на _id
поле).
Този метод замества целия документ (с изключение на _id
поле).
Нагоре
Всички горепосочени методи приемат upsert
аргумент, който ви позволява да извършите операция upsert.
Когато upsert: true
, документът се актуализира, ако има съответствие с критериите на заявката, но ако няма съвпадение, се вмъква нов документ.
Пример:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Резултат:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
В този случай нямаше съвпадения, така че документът беше въведен.
Нека проверим колекцията.
db.pets.find()
Резултат:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }