Để thêm trường mới vào object bên trong mảng, dùng positional operator $ kết hợp $set trong update.
Dữ liệu mẫu
> db.demo222.insertOne({"details":[{ "StudentName":"Chris","StudentMarks":78 },{ "StudentName":"David","StudentMarks":89 }]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ee31703d395bdc213472f") }
Thêm SubjectName cho Chris
> db.demo222.update(
{"details.StudentName" : "Chris"},
{"$set" : {"details.$.SubjectName":"MongoDB"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kết quả
{ "_id" : ObjectId("5e3ee31703d395bdc213472f"), "details" : [ { "StudentName" : "Chris", "StudentMarks" : 78, "SubjectName" : "MongoDB" }, { "StudentName" : "David", "StudentMarks" : 89 } ] }
Giải thích:
{"details.StudentName": "Chris"}: Tìm document có phần tử StudentName="Chris"details.$.SubjectName:$trỏ đến phần tử đầu tiên khớp trong mảng$set: Thêm trường mới SubjectName vào object đó
Lưu ý:
- Chỉ cập nhật 1 phần tử đầu tiên khớp
- Nếu cần cập nhật tất cả phần tử khớp, dùng
arrayFilters(MongoDB 3.6+):{$set: {"details.$[elem].SubjectName": "MongoDB"}}, {arrayFilters: [{"elem.StudentName": "Chris"}]} - Để thêm phần tử mới vào mảng (push), dùng
$push:{$push: {details: {StudentName: "New", StudentMarks: 100}}}