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.