Hvis du er ligeglad med atomicitet, kan du gøre 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);
Hovedproblemet med denne løsning er, at den ikke er atomare. Så enhver opdatering til doc
mellem findOne
og save
vil gå tabt.
Alternativet er faktisk at unset
alle uønskede felter i stedet for at gemme 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});
Denne løsning er meget bedre, fordi mongo kører update
atomisk, så ingen opdatering går tabt. Og du behøver ikke en anden samling for at gøre, hvad du vil.