MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie entferne ich alle Felder außer einem bekannten Satz von Feldern?

Wenn Sie sich nicht um Atomarität kümmern, können Sie dies mit save tun :

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);

Das Hauptproblem dieser Lösung ist, dass sie nicht atomar ist. Also, jede Aktualisierung von doc zwischen findOne und save gehen verloren.

Alternative ist tatsächlich unset alle unerwünschten Felder, anstatt das doc zu speichern :

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});

Diese Lösung ist viel besser, da Mongo update ausführt atomar, sodass keine Aktualisierung verloren geht. Und Sie brauchen keine weitere Sammlung, um das zu tun, was Sie wollen.