1

さて、私は 1 億のレコードを持つ MongoDB コレクションを修正しています。前の開発者がデフォルトの _id を本当に間違ったもので上書きしました。修正したら、_id インデックスを再生成するにはどうすればよいですか? mongoRestore 以外に、より速い方法はありますか?


ここに私の更新手順があります:

1) データベースを元の DB から別の DB にコピーします。

2) すべてのレコードの _id を削除します。

3) すべてのレコードの _id を再生成します (これはどうすればよいかわかりません)

4) 新しい _id を使用してコレクションを元の DB にコピーします (または、新しい / temp DB から mongoDump を作成します。次に、ファイルを元の DB、MongoRestore に送信します (その後、各レコードには新しい _id が含まれます。方法は機能しますが、遅いようです。)

4

1 に答える 1

1

デフォルトの MongoDB '_id' 値は、ドキュメントが最初に挿入されたときに、クライアント側の MongoDB ドライバーによって生成されます。これは、現在の時刻、クライアントが実行されているマシンのホスト名、クライアントのプロセス ID、および同じプロセスによる複数の操作を区別するために使用される増分値を使用して生成されます。

詳細については、http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecificationを参照してください。

その結果、上記のすべての情報をエントリとしてドキュメントに保存しない限り、元のデフォルトの MongoDB '_id' 値を再構築する方法はありません。

さらに、「_id」フィールドは不変であり、変更することはできません。前の開発者が最初に _id フィールドをどのように上書きしたかはわかりません。私の推測では、彼はドキュメントを取得し、_id フィールドの値を変更し、古いものを削除して、新しいものを挿入したと思われます。

「mongodump」を実行してから「_id」フィールド以外のドキュメントの内容が変更されていない場合、データを元に戻す最も簡単な方法は、そのダンプ ファイルを復元することです。

ドキュメントの内容が変更され、変更を保持したい場合は、以前の開発者が行ったのと同じことを逆に実行する必要があります: コレクション内のすべてのドキュメントをフェッチし、ネイティブ ドライバーの機能を使用して新しいドキュメントを作成します。 ObjectID、古いドキュメントを削除し、データを新しい _id を持つ新しいドキュメントとして保存します。

于 2012-07-18T19:46:30.317 に答える