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

Thêm trường vào tài liệu nhúng trong mảng MongoDB

Khi cần thêm trường mới vào một đối tượng cụ thể bên trong mảng, MongoDB sử dụng toán tử định vị $ (positional operator) kết hợp với update() và $set. Toán tử $ tham chiếu đến phần tử đầu tiên trong mảng khớp với điều kiện truy vấn.

Tạo dữ liệu mẫu

> db.addAFieldDemo.insertOne( 
  { 
    "ClientName" : "Larry", 
    "ClientCountryName" : "US", 
    "ClientOtherDetails" : [ 
      { "ClientProjectName" : "Online Banking System" } 
    ] 
  }
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd44bdc2cba06f46efe9ee8") }

Xem dữ liệu ban đầu

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

Thêm trường vào tài liệu nhúng trong mảng

Sử dụng $elemMatch để tìm phần tử mảng, sau đó $ để cập nhật chính phần tử đó:

> db.addAFieldDemo.update(
  {ClientOtherDetails: {$elemMatch: {"ClientProjectName" : "Online Banking System"}}}, 
  {$set : {'ClientOtherDetails.$.isMarried': true}}, 
  true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

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

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

Giải thích các thành phần

  • $elemMatch: Khớp tài liệu có ít nhất một phần tử mảng thỏa mãn tất cả điều kiện con
  • $ (positional operator): Tham chiếu đến phần tử mảng đầu tiên khớp với điều kiện truy vấn
  • 'ClientOtherDetails.$.isMarried': Thêm trường isMarried vào chính phần tử đó
  • Tham số true cuối: upsert = true (tạo mới nếu không tìm thấy)

Lưu ý quan trọng

  • Toán tử $ chỉ cập nhật một phần tử đầu tiên khớp
  • Nếu cần cập nhật nhiều phần tử, sử dụng arrayFilters (MongoDB 3.6+) hoặc Aggregation Pipeline
  • Cú pháp hiện đại: updateOne() hoặc updateMany() thay cho update()

Ví dụ với arrayFilters (MongoDB 3.6+)

db.addAFieldDemo.updateMany(
  {},
  {$set: {"ClientOtherDetails.$[elem].isMarried": true}},
  {arrayFilters: [{"elem.ClientProjectName": "Online Banking System"}]}
);