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.