Si no le importa la atomicidad, puede hacerlo con 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);
El principal problema de esta solución es que no es atómica. Entonces, cualquier actualización de doc
entre findOne
y save
se perderá.
La alternativa es realmente unset
todos los campos no deseados en lugar de guardar el 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});
Esta solución es mucho mejor porque mongo ejecuta update
atómicamente, por lo que no se perderá ninguna actualización. Y no necesitas otra colección para hacer lo que quieres.