Si vous ne vous souciez pas de l'atomicité, vous pouvez le faire avec 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);
Le principal problème de cette solution est qu'elle n'est pas atomique. Donc, toute mise à jour de doc
entre findOne
et save
sera perdu.
L'alternative est en fait de unset
tous les champs indésirables au lieu d'enregistrer le 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});
Cette solution est bien meilleure car mongo exécute update
atomiquement, donc aucune mise à jour ne sera perdue. Et vous n'avez pas besoin d'une autre collection pour faire ce que vous voulez.