MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment puis-je désactiver tous les champs à l'exception d'un ensemble connu de champs ?

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.