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

Cập nhật document lồng nhau (nested embedded) trong MongoDB

Để cập nhật document lồng sâu trong mảng, sử dụng update() kết hợp positional operator ($) để xác định vị trí phần tử trong mảng.

Tạo collection với mảng lồng 2 cấp

> db.demo643.insertOne({
  details: [
    {
      "CountryName": "US",
      StudentDetails: [{Name:"Chris"}, {SubjectName:"MySQL"}]
    },
    {
      "CountryName": "UK",
      StudentDetails: [{Name:"Bob"}, {SubjectName:"Java"}]
    }
  ]
});

Hiển thị cấu trúc gốc

> db.demo634.find();

Kết quả:

{
  "details": [
    { "CountryName": "US", "StudentDetails": [{ "Name": "Chris" }, { "SubjectName": "MySQL" }] },
    { "CountryName": "UK", "StudentDetails": [{ "Name": "Bob" }, { "SubjectName": "Java" }] }
  ]
}

Thêm trường Marks vào StudentDetails của UK

> db.demo643.update(
  { "details.CountryName": "UK" },
  { "$push": { "details.$.StudentDetails": { Marks: 78 } } }
)
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

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

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

Kết quả:

{
  "details": [
    { "CountryName": "US", "StudentDetails": [{ "Name": "Chris" }, { "SubjectName": "MySQL" }] },
    {
      "CountryName": "UK",
      "StudentDetails": [
        { "Name": "Bob" },
        { "SubjectName": "Java" },
        { "Marks": 78 }  // <-- Đã thêm
      ]
    }
  ]
}

Giải thích:

  • { "details.CountryName": "UK" }: Tìm document có phần tử trong mảng details với CountryName = "UK"
  • details.$: Positional operator $ trỏ đến **phần tử đầu tiên** khớp trong mảng details (index của UK)
  • $push: Thêm phần tử mới vào mảng StudentDetails của phần tử đó

Lưu ý: Positional operator $ chỉ cập nhật **một** phần tử khớp đầu tiên. Nếu cần cập nhật nhiều phần tử, dùng $[] (all positional) MongoDB 3.6+.