Jika Anda tidak peduli dengan atomisitas maka Anda dapat melakukannya dengan 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);
Masalah utama dari solusi ini adalah bahwa itu bukan atom. Jadi, setiap pembaruan untuk doc
antara findOne
dan save
akan hilang.
Alternatif sebenarnya adalah unset
semua bidang yang tidak diinginkan alih-alih menyimpan 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});
Solusi ini jauh lebih baik karena mongo menjalankan update
atom, jadi tidak ada pembaruan yang akan hilang. Dan Anda tidak perlu koleksi lain untuk melakukan apa yang Anda inginkan.