やりがいのあることとしては、やらなければならないことはひどいように聞こえますが、解決策は実際には非常に簡単です。もちろん、これはレコードの数によって異なります。しかし、これが私の例です:
db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
{
for(i = 0; i != item.Value.Tiers.length; ++i)
{
item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
delete item.Value.Tiers[i].AssetsUnderManagement;
}
db.Setting.update({_id: item._id}, item);
});
配列が見つかり、「間違った」名前が見つかったコレクションを繰り返し処理します。次に、サブコレクションを繰り返し処理し、新しい値を設定し、古い値を削除して、ドキュメント全体を更新します。比較的痛みはありませんでした。確かに、検索する行は数万行しかなく、そのうち数十行だけが基準を満たしています。
それでも、この回答が誰かに役立つことを願っています!
編集:snapshot()
を追加しました クエリに。コメントで理由を確認してください。
snapshot()
を適用する必要があります データベースからドキュメントを取得する前にカーソルを移動します。使用できるのはsnapshot()
のみです。 シャーディングされていないコレクションを使用します。
MongoDB 3.4から、snapshot()
関数が削除されました。したがって、Mongo 3.4以降を使用している場合、上記の例ではsnapshot()
を削除する必要があります。 機能。