Để xóa các giá trị khỏi mảng trong MongoDB, bạn sử dụng toán tử $pull kết hợp với tùy chọn multi: true để áp dụng cho nhiều tài liệu. Dưới đây là ví dụ minh họa chi tiết.
1. Tạo bộ sưu tập và chèn dữ liệu mẫu
Trước tiên, tạo collection demo392 và chèn 2 tài liệu có trường details là mảng các đối tượng chứa _id:
> db.demo392.insertOne({
Name: 'Chris',
details: [
{ _id: '101' },
{ _id: '102' }
]
});
{
"acknowledged": true,
"insertedId": ObjectId("5e5d2b3322064be7ab44e802")
}
> db.demo392.insertOne({
Name: 'Chris',
details: [
{ _id: '104' },
{ _id: '101' }
]
});
{
"acknowledged": true,
"insertedId": ObjectId("5e5d2b3422064be7ab44e803")
}
2. Xem dữ liệu ban đầu
Sử dụng find() để hiển thị tất cả tài liệu:
> db.demo392.find();
Kết quả:
{
"_id": ObjectId("5e5d2b3322064be7ab44e802"),
"Name": "Chris",
"details": [ { "_id": "101" }, { "_id": "102" } ]
}
{
"_id": ObjectId("5e5d2b3422064be7ab44e803"),
"Name": "Chris",
"details": [ { "_id": "104" }, { "_id": "101" } ]
}
3. Xóa phần tử có _id = '101' khỏi mảng details
Sử dụng update() với $pull và multi: true để xóa tất cả các phần tử khớp trong mọi tài liệu:
> db.demo392.update(
{},
{ $pull: { details: { _id: '101' } } },
{ multi: true }
)
WriteResult({ "nMatched": 2, "nUpserted": 0, "nModified": 2 })
4. Kết quả sau khi xóa
Chạy lại find() để kiểm tra:
> db.demo392.find();
Kết quả:
{
"_id": ObjectId("5e5d2b3322064be7ab44e802"),
"Name": "Chris",
"details": [ { "_id": "102" } ]
}
{
"_id": ObjectId("5e5d2b3422064be7ab44e803"),
"Name": "Chris",
"details": [ { "_id": "104" } ]
}
Lưu ý: Từ MongoDB 3.2+, nên dùng updateMany() thay cho update() với multi: true vì đã được deprecated.