MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come posso annullare l'impostazione di tutti i campi tranne un insieme noto di campi?

Se non ti interessa l'atomicità, puoi farlo 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);

Il problema principale di questa soluzione è che non è atomico. Quindi, qualsiasi aggiornamento a doc tra findOne e save andrà perso.

L'alternativa è effettivamente unset tutti i campi indesiderati invece di salvare il 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});

Questa soluzione è molto migliore perché mongo esegue update atomicamente, quindi nessun aggiornamento andrà perso. E non hai bisogno di un'altra collezione per fare quello che vuoi.