Ако не ви интересува атомарността, можете да го направите с 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
атомарно, така че нито една актуализация няма да бъде загубена. И нямате нужда от друга колекция, за да направите това, което искате.