Jeśli nie zależy Ci na atomizacji, możesz to zrobić za pomocą 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);
Głównym problemem tego rozwiązania jest to, że nie jest atomowe. Tak więc każda aktualizacja doc
między findOne
i save
zostaną utracone.
Alternatywą jest faktyczne unset
wszystkie niechciane pola zamiast zapisywania 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});
To rozwiązanie jest znacznie lepsze, ponieważ mongo uruchamia update
atomowo, więc żadna aktualizacja nie zostanie utracona. I nie potrzebujesz kolejnej kolekcji, aby robić to, co chcesz.