Xóa trường trong mảng với delete() trong mongo shell (JavaScript)
Cách thủ công duyệt cursor, sửa object JavaScript, rồi save() lại. Không phải operator MongoDB, chỉ chạy được trong shell.
1. Dữ liệu mẫu
> db.demo464.insertOne({
id: "101",
details: [{ Name: "Chris" }, { Name: "David" }]
});
{ "acknowledged": true, "insertedId": ObjectId("5e7f8832cb66ccba22cc9dda") }
2. Script xóa trường Name trong mảng details
> db.demo464.find({ id: "101" }).forEach(function(mongoDocument) {
var details = mongoDocument.details;
for (var j = 0; j < details.length; ++j) {
var array = details[j];
delete array["Name"]; // JavaScript delete operator
}
db.demo464.save(mongoDocument); // Lưu lại document đã sửa
});
3. Kết quả
> db.demo464.find();
{ "_id": ObjectId("5e7f8832cb66ccba22cc9dda"), "id": "101", "details": [{ }, { }] }
⚠️ Cảnh báo lớn
| Vấn đề | Mô tả |
| Chỉ chạy trong shell | Không dùng được trong application driver |
| Rất chậm | Load doc → sửa JS → save từng doc (round-trip) |
| Không atomic | Giữa find và save có thể race condition |
| save() deprecated | MongoDB 4.2+ khuyến cáo replaceOne/updateOne |
Cách CHUẨN với MongoDB Operator ($unset + positional $)
// Xóa trường Name của TẤT CẢ phần tử trong mảng details
db.demo464.updateMany(
{ id: "101" },
{ $unset: { "details.$[].Name": "" } } // $[] = all positional (MongoDB 3.6+)
);
Kết quả chuẩn
{ "_id": ObjectId("..."), "id": "101", "details": [{ }, { }] }
So sánh các cách xóa trong mảng
| Cách | Operator | Phạm vi | Version |
| Xóa trường ở 1 phần tử khớp | $unset + $ (positional) | 1 phần tử đầu tiên match | Tất cả |
| Xóa trường ở TẤT CẢ phần tử | $unset + $[] (all positional) | Tất cả phần tử | 3.6+ |
| Xóa trường ở phần tử filter | $unset + $[] (filtered positional) | Phần tử match arrayFilters | 3.6+ |
| Xóa phần tử khỏi mảng | $pull | Toàn mảng | Tất cả |
Ví dụ $pull (xóa hẳn phần tử)
// Xóa phần tử có Name="Chris" khỏi mảng details
db.demo464.updateMany(
{ id: "101" },
{ $pull: { details: { Name: "Chris" } } }
);
// Kết quả: details chỉ còn [{ Name: "David" }]