MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como faço para desmarcar todos os campos, exceto um conjunto conhecido de campos?


Se você não se importa com a atomicidade, pode fazê-lo com 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);

O principal problema desta solução é que ela não é atômica. Portanto, qualquer atualização para doc entre findOne e save será perdido.

A alternativa é realmente unset todos os campos indesejados em vez de salvar o 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 solução é muito melhor porque o mongo executa update atomicamente, então nenhuma atualização será perdida. E você não precisa de outra coleção para fazer o que quiser.