sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo anulo todos los campos excepto un conjunto de campos conocido?

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.