Nếu bạn không quan tâm đến tính nguyên tử thì bạn có thể làm điều đó với save :
doc = db.myCollection.findOne({"_id": 123});
for (k in doc.field_to_prune) {
if (k === 'keep_field_1') continue;
if (k === 'keep_field_2') continue;
delete doc.field_to_prune[k];
}
db.myCollection.save(doc);
Vấn đề chính của giải pháp này là nó không phải là nguyên tử. Vì vậy, bất kỳ bản cập nhật nào cho doc giữa findOne và save sẽ bị mất.
Cách khác là thực sự unset tất cả các trường không mong muốn thay vì lưu doc :
doc = db.myCollection.findOne({"_id": 123});
unset = {};
for (k in doc.field_to_prune) {
if (k === 'keep_field_1') continue;
if (k === 'keep_field_2') continue;
unset['field_to_prune.'+k] = 1;
}
db.myCollection.update({_id: doc._id}, {$unset: unset});
Giải pháp này tốt hơn nhiều vì mongo chạy update về mặt nguyên tử, vì vậy không có bản cập nhật nào sẽ bị mất. Và bạn không cần một bộ sưu tập khác để làm những gì bạn muốn.