Ако не ви интересува атомарността, можете да го направите с 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);
Основният проблем на това решение е, че не е атомно. И така, всяка актуализация на doc между findOne и save ще бъдат загубени.
Алтернативата е действително да unset всички нежелани полета, вместо да запазите 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});
Това решение е много по-добро, защото mongo изпълнява update атомарно, така че нито една актуализация няма да бъде загубена. И нямате нужда от друга колекция, за да направите това, което искате.