Để xóa bản ghi cụ thể từ mảng lồng sâu, sử dụng $pull với positional operator. Tạo collection:
> db.demo213.insertOne({
"id": 101,
"details1": [
{
"Name": "Chris",
"details2": [
{ "StudentName": "David", "Subject": "MongoDB" },
{ "StudentName": "Mike", "Subject": "MySQL" }
]
}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e300c03d395bdc2134704") }
Hiển thị tài liệu:
> db.demo213.find().pretty();
Kết quả:
Xóa phần tử trong details2 có Subject="MySQL" nơi details1.Name="Chris":
> db.demo213.update( { "id": 101, "details1.Name": "Chris" }, { "$pull": { "details1.$.details2": { "Subject": "MySQL" } } }, { multi: true } ); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })Kết quả sau xóa - chỉ còn David/MongoDB:
> db.demo213.find().pretty();Cơ chế:
details1.$.details2dùng positional operator$để trỏ đến phần tử details1 khớp điều kiện (Name="Chris"), sau đó$pullxóa phần tử khớp trong details2.