Để xóa tất cả phần tử trong một trường mảng (làm rỗng mảng) trong MongoDB, bạn sử dụng $set gán mảng rỗng [].
Cú pháp
db.yourCollectionName.update(
{}, // query - rỗng = tất cả document
{ $set: { "yourArrayField": [] } },
{ multi: true } // cập nhật nhiều document
);
Ví dụ minh họa
Tạo collection và dữ liệu
> db.deleteAllElementsInArrayDemo.insertOne({"InstructorName":"Larry","InstructorTechnicalSubject":["Java","MongoDB"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8fb971d3c9d04998abf00e") }
> db.deleteAllElementsInArrayDemo.insertOne({"InstructorName":"Mike","InstructorTechnicalSubject":["C","C++","Python"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8fb98ad3c9d04998abf00f") }
Xem dữ liệu ban đầu
> db.deleteAllElementsInArrayDemo.find().pretty();
{
"_id" : ObjectId("5c8fb971d3c9d04998abf00e"),
"InstructorName" : "Larry",
"InstructorTechnicalSubject" : [ "Java", "MongoDB" ]
}
{
"_id" : ObjectId("5c8fb98ad3c9d04998abf00f"),
"InstructorName" : "Mike",
"InstructorTechnicalSubject" : [ "C", "C++", "Python" ]
}
Xóa tất cả phần tử mảng InstructorTechnicalSubject
> db.deleteAllElementsInArrayDemo.update(
{},
{ $set: { "InstructorTechnicalSubject": [] } },
{ multi: true }
);
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Kiểm tra kết quả
> db.deleteAllElementsInArrayDemo.find().pretty();
{
"_id" : ObjectId("5c8fb971d3c9d04998abf00e"),
"InstructorName" : "Larry",
"InstructorTechnicalSubject" : [ ]
}
{
"_id" : ObjectId("5c8fb98ad3c9d04998abf00f"),
"InstructorName" : "Mike",
"InstructorTechnicalSubject" : [ ]
}
Cả 2 document đều có mảng InstructorTechnicalSubject rỗng [].
Phương pháp hiện đại (MongoDB 3.2+)
Khuyến khích dùng updateMany():
db.deleteAllElementsInArrayDemo.updateMany(
{},
{ $set: { "InstructorTechnicalSubject": [] } }
);
So sánh các cách xóa mảng
| Phương pháp | Cú pháp | Kết quả | Lưu ý |
|---|---|---|---|
$set: {arr: []} | Gán mảng rỗng | Mảng rỗng [] | Nhanh, đơn giản |
$unset: {arr: 1} | Xóa trường | Trường biến mất | Document không còn trường đó |
$pull: {arr: {$exists: true}} | Pull tất cả | Mảng rỗng [] | Chậm hơn, không cần thiết |
$set: {arr: null} | Gán null | Trường = null | Khác mảng rỗng |
Xóa mảng cho document cụ thể
// Chỉ document có InstructorName = "Larry"
db.deleteAllElementsInArrayDemo.updateOne(
{ "InstructorName": "Larry" },
{ $set: { "InstructorTechnicalSubject": [] } }
);
Lưu ý
multi: true(hoặc updateMany) cần thiết để áp dụng cho tất cả document khớp query- Mảng rỗng
[]khác vớinullvà khác với trường không tồn tại - Index trên trường mảng vẫn được giữ nguyên