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

Thay thế giá trị trong mảng MongoDB

Để thay thế giá trị của một phần tử cụ thể trong mảng, MongoDB sử dụng toán tử $set kết hợp với positional operator $. Toán tử $ xác định vị trí phần tử khớp với điều kiện truy vấn.

Tạo dữ liệu mẫu

> db.replaceValueInArrayDemo.insertOne({"StudentScores":[45,56,78]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f0421a844af18acdffb7") }
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[33,90,67]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f0521a844af18acdffb8") }

Xem dữ liệu

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

Thay thế giá trị 45 thành 99 trong tài liệu đầu tiên

> db.replaceValueInArrayDemo.update(
  {_id: ObjectId("5cd7f0421a844af18acdffb7"), StudentScores: 45}, 
  {$set: {'StudentScores.$': 99}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Kết quả

{ "_id" : ObjectId("5cd7f0421a844af18acdffb7"), "StudentScores" : [ 99, 56, 78 ] }
{ "_id" : ObjectId("5cd7f0521a844af18acdffb8"), "StudentScores" : [ 33, 90, 67 ] }

Giải thích

  • {_id: ..., StudentScores: 45}: Tìm tài liệu có _id đúng VÀ mảng StudentScores chứa giá trị 45
  • StudentScores.$: Positional operator $ tham chiếu đến phần tử đầu tiên trong mảng khớp với điều kiện StudentScores: 45
  • $set: {'StudentScores.$': 99}: Thay thế giá trị của phần tử đó bằng 99

Lưu ý quan trọng

  • $ chỉ cập nhật một phần tử đầu tiên khớp
  • Nếu mảng có nhiều giá trị 45, chỉ cái đầu tiên được thay đổi
  • Điều kiện trong query (StudentScores: 45) xác định vị trí $ trỏ đến

Cập nhật tất cả phần tử khớp (MongoDB 3.6+)

Sử dụng arrayFilters với $[<identifier>]:

db.replaceValueInArrayDemo.updateMany(
  {},
  {$set: {"StudentScores.$[elem]": 99}},
  {arrayFilters: [{"elem": 45}]}
);

Cập nhật theo chỉ số (index)


Các thao tác mảng khác

Toán tửChức năng
$pushThêm phần tử vào cuối
$addToSetThêm nếu chưa có
$pullXóa phần tử khớp giá trị
$pullAllXóa nhiều giá trị
$popXóa đầu/cuối (1/-1)
$set với $Cập nhật phần tử khớp