Als je niet om atomiciteit geeft, kun je het doen met 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);
Het belangrijkste probleem van deze oplossing is dat het niet atomair is. Dus elke update naar doc tussen findOne en save zal verloren gaan.
Alternatief is om daadwerkelijk unset alle ongewenste velden in plaats van het doc . op te slaan :
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});
Deze oplossing is veel beter omdat mongo update uitvoert atomair, dus er gaat geen update verloren. En je hebt geen andere verzameling nodig om te doen wat je wilt.