Om du inte bryr dig om atomicitet kan du göra det med 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);
Huvudproblemet med denna lösning är att den inte är atomär. Så, alla uppdateringar till doc
mellan findOne
och save
kommer att gå förlorad.
Alternativet är att faktiskt unset
alla oönskade fält istället för att spara 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});
Denna lösning är mycket bättre eftersom mongo kör update
atomärt, så ingen uppdatering kommer att gå förlorad. Och du behöver ingen annan samling för att göra vad du vill.