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.