Sử dụng toán tử vị trí $ kết hợp với $set để cập nhật phần tử cụ thể trong mảng lồng nhau. Tạo collection với dữ liệu server:
> db.demo707.insertOne({
... id:101,
... "serverInformation": [
... { "IP":"192.56.34.3", "Status":"Active" },
... { "IP":"192.56.36.4", "Status":"Inactive" }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea6f852551299a9f98c93c8") }
Hiển thị dữ liệu ban đầu:
> db.demo707.find();
{ "_id" : ObjectId("5ea6f852551299a9f98c93c8"), "id" : 101, "serverInformation" : [ { "IP" : "192.56.34.3", "Status" : "Active" }, { "IP" : "192.56.36.4", "Status" : "Inactive" } ] }
Cập nhật server có IP "192.56.34.3" từ Active sang Inactive:
> db.demo707.update(
... {"serverInformation.IP":"192.56.34.3"},
... {$set:{"serverInformation.$.Status":"Inactive"}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kiểm tra kết quả:
> db.demo707.find();
{ "_id" : ObjectId("5ea6f852551299a9f98c93c8"), "id" : 101, "serverInformation" : [ { "IP" : "192.56.34.3", "Status" : "Inactive" }, { "IP" : "192.56.36.4", "Status" : "Inactive" } ] }
Giải thích: 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, cho phép cập nhật chính xác phần tử đó mà không ảnh hưởng phần tử khác.