Để 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ị 45StudentScores.$: Positional operator$tham chiếu đến phần tử đầu tiên trong mảng khớp với điều kiệnStudentScores: 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 |
|---|---|
$push | Thêm phần tử vào cuối |
$addToSet | Thêm nếu chưa có |
$pull | Xóa phần tử khớp giá trị |
$pullAll | Xóa nhiều giá trị |
$pop | Xóa đầu/cuối (1/-1) |
$set với $ | Cập nhật phần tử khớp |