MongoDB cung cấp nhiều cách khác nhau để cập nhật tài liệu. Phương pháp bạn sử dụng sẽ phụ thuộc vào chính xác cách bạn muốn thực hiện cập nhật.
Bài viết này trình bày 4 cách để cập nhật tài liệu trong MongoDB.
db.collection.updateOne()
Phương pháp
db.collection.updateOne()
phương thức hoạt động chính xác như tên của nó hứa hẹn - nó cập nhật một tài liệu.
Giả sử chúng ta có một bộ sưu tập có tên là pets
chứa các tài liệu sau:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Chúng tôi có thể cập nhật một tài liệu như sau:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Kết quả:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Đó chỉ cập nhật một tài liệu, mặc dù hai tài liệu khớp với tiêu chí bộ lọc (tiêu chí là type: "Dog"
).
Chúng tôi có thể kiểm tra kết quả như sau:
db.pets.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Tài liệu đầu tiên hiện có type
của Cow
thay vì Dog
, nhưng tài liệu thứ hai không bị ảnh hưởng, mặc dù nó cũng phù hợp với tiêu chí lọc.
db.collection.updateMany()
Phương pháp
db.collection.updateMany()
phương thức cập nhật tất cả các tài liệu phù hợp với bộ lọc được chỉ định cho một bộ sưu tập.
Hãy sử dụng các tài liệu thu thập ban đầu:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Một lần nữa, chúng ta có thể thấy rằng hai tài liệu có Dog
dưới dạng type
của họ .
Chúng tôi có thể cập nhật cả hai tài liệu cùng một lúc như sau:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Kết quả:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Điều này cho chúng tôi thấy rằng hai tài liệu khớp nhau và hai tài liệu đã được cập nhật.
Chúng tôi có thể kiểm tra bộ sưu tập:
db.pets.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.update()
Phương pháp
db.collection.update()
phương pháp có thể cập nhật một tài liệu hoặc nhiều tài liệu trong một bộ sưu tập.
Theo mặc định, nó chỉ cập nhật một tài liệu duy nhất. Nhưng nếu multi: true
được chỉ định, sau đó nó cập nhật tất cả các tài liệu phù hợp với tiêu chí truy vấn.
Cập nhật một tài liệu duy nhất
Hãy sử dụng lại bộ sưu tập tài liệu ban đầu:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Chúng tôi có thể cập nhật một tài liệu như sau:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Kết quả:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Chỉ có một tài liệu được cập nhật. Điều này được xác nhận khi chúng tôi truy vấn bộ sưu tập.
db.pets.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Cập nhật nhiều tài liệu
Hãy quay lại bộ sưu tập tài liệu ban đầu một lần nữa:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Và bây giờ chúng ta sẽ thêm multi: true
hoạt động cập nhật của chúng tôi để cập nhật tất cả các tài liệu phù hợp với tiêu chí truy vấn:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Kết quả:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Vì vậy, hai tài liệu đã được khớp và cập nhật lần này.
Hãy xem lại bộ sưu tập của chúng tôi:
db.pets.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Như mong đợi, cả hai tài liệu hiện có type
của Cow
.
db.collection.replaceOne()
Phương pháp
db.collection.replaceOne()
phương thức thay thế một tài liệu trong bộ sưu tập dựa trên bộ lọc.
Một lần nữa sử dụng bộ sưu tập ban đầu:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Hãy xem điều gì sẽ xảy ra khi chúng ta sử dụng db.collection.replaceOne()
phương pháp chống lại nó.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Kết quả:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Một tài liệu đã được cập nhật.
Hãy cùng xem.
db.pets.find()
Kết quả:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Lần này, toàn bộ tài liệu đã được thay thế bằng tài liệu mới (ngoại trừ _id
đồng ruộng).
Phương pháp này thay thế toàn bộ tài liệu (ngoại trừ _id
trường).
Nâng cấp
Tất cả các phương pháp trên đều chấp nhận một upsert
đối số cho phép bạn thực hiện thao tác nâng cấp.
Khi upsert: true
, tài liệu sẽ được cập nhật nếu có sự phù hợp với tiêu chí truy vấn, nhưng nếu không có sự phù hợp, một tài liệu mới sẽ được chèn vào.
Ví dụ:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Kết quả:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
Trong trường hợp này, không có kết quả phù hợp nào nên một tài liệu đã được nâng cấp.
Hãy kiểm tra bộ sưu tập.
db.pets.find()
Kết quả:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }