Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cập nhật phần tử bên trong mảng trong MongoDB

Để cập nhật trường của phần tử trong mảng, sử dụng $set kết hợp positional operator ($) để xác định vị trí phần tử khớp điều kiện.

Tạo collection với mảng CollegeDetails

> db.demo494.insertOne({
  "CollegeDetails": [
    { "CollegeName": "MIT", "Fees": 80000 },
    { "CollegeName": "SU", "Fees": 90000 }
  ]
});

Hiển thị dữ liệu gốc

> db.demo494.find().pretty();

Kết quả:

{
  "CollegeDetails": [
    { "CollegeName": "MIT", "Fees": 80000 },
    { "CollegeName": "SU", "Fees": 90000 }
  ]
}

Cập nhật Fees của MIT từ 80000 thành 100000

> db.demo494.update(
  { "CollegeDetails.CollegeName": "MIT" },
  { $set: { "CollegeDetails.$.Fees": 100000 } }
)
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

Kết quả sau cập nhật

> db.demo494.find().pretty();

Kết quả:

{
  "CollegeDetails": [
    { "CollegeName": "MIT", "Fees": 100000 },  // Đã cập nhật
    { "CollegeName": "SU", "Fees": 90000 }
  ]
}

Giải thích:

  • Filter {"CollegeDetails.CollegeName": "MIT"}: Tìm document có phần tử trong mảng CollegeDetails với CollegeName = "MIT"
  • CollegeDetails.$.Fees: Positional operator $ đại diện cho **index của phần tử đầu tiên khớp** trong mảng (index 0 - MIT)
  • $set: Chỉ cập nhật trường Fees của phần tử đó

Lưu ý quan trọng:

  • Positional $ chỉ cập nhật **một** phần tử khớp đầu tiên
  • Nếu có 2 MIT trong mảng, chỉ cái đầu được cập nhật
  • MongoDB 3.6+: Dùng $[] với arrayFilters để cập nhật **tất cả** phần tử khớp:
db.demo494.update(
  {},
  { $set: { "CollegeDetails.$[elem].Fees": 100000 } },
  { arrayFilters: [{ "elem.CollegeName": "MIT" }], multi: true }
)

Cách này cập nhật Fees cho **tất cả** MIT trong mảng của **tất cả** document.