Wenn Sie sich nicht um Atomarität kümmern, können Sie dies mit save
tun :
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);
Das Hauptproblem dieser Lösung ist, dass sie nicht atomar ist. Also, jede Aktualisierung von doc
zwischen findOne
und save
gehen verloren.
Alternative ist tatsächlich unset
alle unerwünschten Felder, anstatt das doc
zu speichern :
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});
Diese Lösung ist viel besser, da Mongo update
ausführt atomar, sodass keine Aktualisierung verloren geht. Und Sie brauchen keine weitere Sammlung, um das zu tun, was Sie wollen.