サイト自体がダウンしない場合は、いかなる理由でもサイトをダウンさせるべきではありません。:)
何百万ものレコードがあっても、問題の解決策は ID の使い方にあります。
これらの ID を使用して異なるコレクション内のドキュメントを相互参照すると、更新されたオブジェクトごとに、このオブジェクトを参照する他のすべてのオブジェクトが更新されます。
最初のステップとして、システムを更新して、古い方法で新しいオブジェクトを作成しないようにする必要があります。システムでこれを簡単に実行できる場合は、データベースを非常に簡単に更新できます。この変更が簡単でない場合は、システムにアーキテクチャ上の問題があり、最初にこれを変更する必要があります。このような状況の場合は、回答を更新できるように質問を更新してください。
私はあなたのアプリケーションとデータについて何も知らないので、私が言うことはあまりにも一般的です. coll_bad_id を更新したいコレクションを呼び出しましょう。このコレクションのすべてのアイテムは、coll_poor_guy や coll_wisdom_searcher などの他のコレクションで参照されます。これを行う方法は、次のように coll_bad_id を一度に 1 つずつ実行することです。
1. read one item
2. update _id with new style of _id
3. insert item back to collection
-- now we have two copies of the same item one with old-style id, one with new
4. update each item referencing this to use new style id
5. remove the duplicate item with old-style id from collection
覚えておくべきことの 1 つは、bson ObjectId が非常に役立つ日付/時刻データを保持していることです。これらすべてのオブジェクトを 1 日に再構築するため、ObjectId にはこれらのアイテムの正しい作成時間が反映されません。新しく追加されたアイテムについては、そうします。最初に新しく追加されたアイテムは、正しい作成時間の ID を持つアイテムのマイルストーンとして記録できます。
更新: Mongo シェルで実行するコード サンプル。これは最も効率的な方法ではありません。しかし、新しい _id で追加する前に何も削除しないので、安全に実行できます。find() 呼び出しにクエリを追加することで、これを少量で行うことができます。
var cursor = db.testcoll.find()
cursor.forEach(function(item) {
var oldid= item._id; // we save old _id to use for removal below.
delete item._id; // When we add an item without _id, Mongo creates a unique _id.
db.testcoll.insert(item); // We add item without _id.
db.testcoll.remove(oldid); // We delete the item with bad _id.
});