Sử dụng toán tử vị trí $ kết hợp update() để cập nhật chính xác phần tử trong mảng tag. Tạo collection:
> db.demo713.insertOne({
... tags: [
... { id:101, Name:"Tag-1" },
... { id:102, Name:"Tag-3" },
... { id:103, Name:"Tag-3" }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea8625a5d33e20ed1097b87") }
Hiển thị dữ liệu:
> db.demo713.find();
{ "_id" : ObjectId("5ea8625a5d33e20ed1097b87"), "tags" : [ { "id" : 101, "Name" : "Tag-1" }, { "id" : 102, "Name" : "Tag-3" }, { "id" : 103, "Name" : "Tag-3" } ] }
Cập nhật tag có id=102 từ "Tag-3" thành "Tag-2":
> db.demo713.update(
... {"tags.id":102},
... {$set:{"tags.$.Name":"Tag-2"}},
... false, true
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kết quả (chỉ tag id=102 bị thay đổi):
> db.demo713.find().pretty();
{ "_id" : ObjectId("5ea8625a5d33e20ed1097b87"), "tags" : [ { "id" : 101, "Name" : "Tag-1" }, { "id" : 102, "Name" : "Tag-2" }, { "id" : 103, "Name" : "Tag-3" } ] }
Tham số update: update(query, update, upsert, multi). Ở đây: upsert=false, multi=true (cập nhật tất cả khớp). Toán tử $ chỉ cập nhật phần tử đầu tiên khớp trong mảng.