Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Loại bỏ giá trị trường kiểu mảng trong MongoDB

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 shellKhông dùng được trong application driver
Rất chậmLoad doc → sửa JS → save từng doc (round-trip)
Không atomicGiữa find và save có thể race condition
save() deprecatedMongoDB 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áchOperatorPhạm viVersion
Xóa trường ở 1 phần tử khớp$unset + $ (positional)1 phần tử đầu tiên matchTấ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 arrayFilters3.6+
Xóa phần tử khỏi mảng$pullToàn mảngTấ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" }]