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

Cập nhật trường lồng nhau trong MongoDB

MongoDB cho phép cập nhật trực tiếp các trường lồng nhau (nested fields) bằng cách sử dụng toán tử $set kết hợp với dot notation. Đây là kỹ thuật thiết yếu khi làm việc với cấu trúc tài liệu phức tạp.

Cú pháp cơ bản

db.yourCollectionName.update(
  {"_id" : yourObjectId}, 
  {$set : {"yourOuterFieldName.yourInnerFieldName" : yourValue}}
);

Ví dụ thực tế

Tạo collection updateDocumentDemo với tài liệu chứa đối tượng lồng nhau:

> db.updateDocumentDemo.insertOne(
  { 
    "StudentDetails" : { 
      "StudentFirstName" : "Adam", 
      "StudentLastName" : "Samith" 
    }, 
    "StudentOtherDetails" : { 
      "StudentFavouriteSubject" : "MySQL", 
      "StudentScore" : 45 
    } 
  }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd50bb32cba06f46efe9efe") }

Xem dữ liệu ban đầu

> db.updateDocumentDemo.find().pretty();
{ 
  "_id" : ObjectId("5cd50bb32cba06f46efe9efe"), 
  "StudentDetails" : { 
    "StudentFirstName" : "Adam", 
    "StudentLastName" : "Samith" 
  }, 
  "StudentOtherDetails" : { 
    "StudentFavouriteSubject" : "MySQL", 
    "StudentScore" : 45 
  } 
}

Cập nhật trường lồng nhau

Thay đổi StudentFavouriteSubject từ "MySQL" thành "MongoDB":

> db.updateDocumentDemo.update(
  {"_id" : ObjectId("5cd50bb32cba06f46efe9efe")}, 
  {$set : {"StudentOtherDetails.StudentFavouriteSubject" :"MongoDB"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Kiểm tra kết quả

> db.updateDocumentDemo.find().pretty();
{ 
  "_id" : ObjectId("5cd50bb32cba06f46efe9efe"), 
  "StudentDetails" : { 
    "StudentFirstName" : "Adam", 
    "StudentLastName" : "Samith" 
  }, 
  "StudentOtherDetails" : { 
    "StudentFavouriteSubject" : "MongoDB", 
    "StudentScore" : 45 
  } 
}

Lưu ý quan trọng

  • Sử dụng dot notation (OuterField.InnerField) để truy cập trường lồng nhau
  • Toán tử $set chỉ cập nhật trường được chỉ định, giữ nguyên các trường khác
  • Trong MongoDB 3.2+, khuyến nghị sử dụng updateOne() hoặc updateMany() thay vì update()