Pokud vám nezáleží na atomicitě, můžete to udělat pomocí 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);
Hlavním problémem tohoto řešení je, že není atomární. Takže jakákoli aktualizace doc
mezi findOne
a save
bude ztracen.
Alternativou je skutečně unset
všechna nechtěná pole místo uložení 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});
Toto řešení je mnohem lepší, protože mongo spouští update
atomicky, takže se žádná aktualizace neztratí. A k tomu, co chcete, nepotřebujete další sbírku.