Cập nhật Dữ liệu Tài liệu MongoDB bằng mongo shell
Chương này giới thiệu cách cập nhật dữ liệu tài liệu MongoDB thông qua mongo shell. MongoDB hỗ trợ các cách cập nhật khác nhau được thực hiện bằng các loại toán tử khác nhau, và nó cũng hỗ trợ nhiều chức năng cập nhật.
Chuẩn bị Dữ liệu Kiểm thử
Insert một lô dữ liệu kiểm thử vào bộ sưu tập inventory.
db.inventory.insertMany( [
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );
Cú pháp Toán tử Cập nhật
Để cập nhật tài liệu, MongoDB cung cấp nhiều toán tử cập nhật (ví dụ, $set) để sửa đổi giá trị trường.
Định dạng của các tham số toán tử cập nhật như sau:
{
<toán tử cập nhật>: { <trường1>: <giá trị1>, ... },
<toán tử cập nhật>: { <trường2>: <giá trị2>, ... },
...
}
Giải thích:
- <toán tử cập nhật>: Toán tử cập nhật
- <trường1>: Tên trường
- <giá trị1>: Tham số trường
Toán tử $set
Được sử dụng để cập nhật tài liệu và tạo một trường mới nếu trường đó không tồn tại.
Cập nhật Một Tài liệu Đơn
Cập nhật một tài liệu bằng cách sử dụng phương thức db.collection.updateOne().
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
Giải thích cập nhật:
- Đầu tiên, truy xuất tài liệu đầu tiên sử dụng điều kiện truy vấn (item = paper).
- Sử dụng toán tử $set để cập nhật giá trị của trường size.uom thành cm và cập nhật giá trị của trường status thành P.
- Sử dụng toán tử $currentDate để cập nhật giá trị của trường lastModified thành ngày hiện tại. Nếu trường lastModified không tồn tại, $currentDate sẽ tạo trường đó.
Cập nhật Nhiều Tài liệu
Sử dụng phương thức db.collection.updateMany() để cập nhật nhiều tài liệu thoả mãn điều kiện.
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
Giải thích cập nhật:
- Đầu tiên, truy xuất tất cả các tài liệu sử dụng điều kiện truy vấn (qty < 50).
- Sử dụng toán tử $set để cập nhật giá trị của trường size.uom thành in và cập nhật giá trị của trường status thành P.
- Sử dụng toán tử $currentDate để cập nhật giá trị của trường lastModified thành ngày hiện tại. Nếu trường lastModified không
Thay thế Tài liệu
Sử dụng phương thức db.collection.replaceOne() để thay thế nội dung của một tài liệu (trừ trường _id). Tài liệu thay thế có thể có các trường khác từ tài liệu gốc. Vì trường _id không thể thay đổi, nó có thể được bỏ qua. Tuy nhiên, nếu bạn bao gồm trường _id, giá trị id phải tương thích với id của tài liệu đang được cập nhật.
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
Giải thích:
- Đầu tiên, sử dụng tiêu chí truy vấn (item=paper) để lấy tài liệu đầu tiên.
- Thay thế tài liệu khớp với nội dung của tham số thứ hai của phương thức replaceOne.
Hành vi Cập nhật
Atomicity (Nguyên tử hóa)
Tất cả các hoạt động ghi trong MongoDB đều nguyên tử hóa ở mức độ tài liệu cá nhân.
Trường _id
Trường _id không thể thay đổi và không thể được cập nhật.