アトミック性を気にしない場合は、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);
このソリューションの主な問題は、アトミックではないことです。したがって、doc
への更新 findOne
の間 およびsave
失われます。
別の方法は、実際にunset
することです 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});
mongoはupdate
を実行するため、このソリューションははるかに優れています アトミックに、更新が失われることはありません。そして、あなたがやりたいことをするために別のコレクションは必要ありません。