MongoDB $setOnInsert
Toán tử cập nhật trường có thể được sử dụng để chèn một giá trị cụ thể trong quá trình nâng cấp.
Nếu thao tác cập nhật dẫn đến tài liệu mới được chèn (tức là bản nâng cấp), thì $setOnInsert
toán tử có hiệu lực, nếu không thì không có hiệu lực.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là dogs
với tài liệu sau:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Và chúng tôi chạy update()
sau lệnh cập nhật tài liệu không tồn tại trong bộ sưu tập:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Điều này sẽ dẫn đến kết quả sau:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Điều này cho chúng tôi biết rằng một tài liệu đã được nâng cấp.
Hãy kiểm tra bộ sưu tập:
db.dogs.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Chúng tôi có thể thấy rằng tài liệu 2 đã được chèn và nó bao gồm trường / giá trị mà chúng tôi đã cung cấp cho $setOnInsert
toán tử (tức là name: "Bark"
).
Khi tài liệu tồn tại (tức là Không có bản nâng cấp)
Bây giờ, hãy cố gắng cập nhật tài liệu mà chúng tôi vừa cập nhật. Hãy sử dụng câu lệnh tương tự như trong ví dụ trước, nhưng với các giá trị khác nhau.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lần này, một tài liệu khớp và đã được cập nhật. Không có gì được nâng lên.
Hãy kiểm tra lại bộ sưu tập.
db.dogs.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Vì vậy, trong trường hợp này, weight
và height
các trường đã được cập nhật, nhưng name
trường thì không.
Lý do trường tên không được cập nhật là do không thực hiện nâng cấp. $setOnInsert
toán tử chỉ chỉ định trường / giá trị sẽ được đặt khi thao tác cập nhật dẫn đến tài liệu mới được chèn (tức là bản bổ sung).