Trong MongoDB, db.collection.update()
phương pháp sửa đổi một tài liệu hiện có hoặc các 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
Giả sử chúng ta có bộ sưu tập được gọi là pets
với 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.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 sử dụng lại các tài liệu gốc:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Lần này, chúng tôi 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
.
Nâng cấp
db.collection.update()
phương thức 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í bộ lọc, nhưng nếu không phù hợp, một tài liệu mới sẽ được chèn vào.
Hãy bắt đầu lại với các tài liệu gốc:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Ví dụ:
db.pets.update(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
Kết quả:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5fe2c925d9914101694102e1") })
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, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe2c925d9914101694102e1"), "name" : "Bubbles", "type" : "Fish" }
Tài liệu được nhúng
Bạn cũng có thể sử dụng db.collection.update()
để cập nhật tài liệu nhúng.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
Chúng tôi có thể sử dụng mã sau để cập nhật tài liệu nhúng.
db.pets.update({
_id: 1
}, {
$set: {
"specs.weight": 20,
"specs.color": "blue"
}
})
Kết quả:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Vì vậy, chúng tôi có thể thấy rằng một tài liệu đã được khớp và sửa đổi.
Hãy kiểm tra tài liệu.
db.pets.find({
_id: 1
}).pretty()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 20, "color" : "blue" } }
Chúng tôi có thể thấy rằng tài liệu nhúng đã được cập nhật như đã chỉ định.
Mảng
Hãy sử dụng db.collection.update()
để cập nhật một mảng.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Hãy cập nhật hai trong số các phần tử của mảng và tên của chú chó.
db.pets.update({
_id: 1
}, {
$set: {
"name": "Bark",
"awards.0": "Bottom Dog",
"awards.1": "Worst Dog"
}
})
Kết quả:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Chúng tôi có thể thấy rằng một tài liệu đã được khớp và sửa đổi.
Và bây giờ hãy xem tài liệu.
db.pets.find().pretty()
Kết quả:
{ "_id" : 1, "name" : "Bark", "type" : "Dog", "awards" : [ "Bottom Dog", "Worst Dog", "Biggest Dog" ] }
Tham số bộ lọc mảng
Bạn cũng có thể sử dụng arrayFilters
tham số và vị trí $
toán tử để xác định phần tử mảng nào cần cập nhật.
Ví dụ:giả sử chúng ta có một bộ sưu tập có tên là players
với các tài liệu sau:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Chúng tôi có thể chạy truy vấn sau để chỉ cập nhật những phần tử mảng có giá trị cao hơn một số lượng nhất định (trong trường hợp này là 10).
db.players.update(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Kết quả:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Như mong đợi, điều này chỉ cập nhật một tài liệu, mặc dù hai tài liệu phù hợp với tiêu chí (vì chúng tôi không chỉ định multi: true
).
Đây là giao diện của các tài liệu bây giờ.
db.players.find()
Kết quả:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Tài liệu 2 đã cập nhật hai phần tử mảng, vì những phần tử đó phù hợp với tiêu chí.
Thông tin thêm
db.collection.update()
phương thức cũng chấp nhận các tham số khác, chẳng hạn như writeConcern
, collation
và hint
.
Xem tài liệu MongoDB cho db.collections.update()
để biết thêm thông tin.