3

クライアントに提供するキーとして MongoDB _id を使用する予定です。したがって、あるコレクションから別のコレクションにデータを移動する必要がある場合でも、このキーを変更しないことが要件です。コピーは、db.copyDatabase() または mongoimport を使用して実行されます。

あるコレクションから別のコレクションにデータをコピーする方法の 1 つは、最初のコレクション (C1) 内のドキュメントを反復処理し、これらのドキュメントを 2 番目のコレクション (C2) に挿入することです。この場合、挿入されるドキュメント (C1 の) に _id が存在するため、_id は (C2 で) 同じままである必要があります (_id を自分で提供する場合と同じです)。

ただし、ドキュメントをコピーする別の方法がある場合、_id は以下に依存するため、変更される可能性があります。

(1) UNIX タイムスタンプ (2) マシン識別子 (3) ProcessId

(**これは、コピー中に MongoDB が C1 のドキュメントから _id を削除し、C2 への挿入中にそれらを再生成した場合にのみ発生しますか?)

宛先コレクションの場所に関係なく、_id 値を同じにする必要があります: (1) 同じデータベース内 (2) 異なるデータベース - 同じマシン (3) 異なるデータベース - 異なるマシン)

ありがとう

4

1 に答える 1

10

いいえ、_id 番号は変更されません。

_id フィールドのないドキュメントがデータベースに挿入されると、新しい ObjectId が生成されます。_id フィールドが既にあるドキュメントを挿入すると、MongoDB はそれに触れません。

タイムスタンプ、マシン ID、およびプロセス ID は、ObjectID が生成された場所を参照します。これはデータベース サーバーにすることもできますが、アプリケーション サーバー上の MongoDB ドライバーによって生成することもできます。その場合、MongoDB はそれ自体を変更しません。

ところで、_id自動生成された ObjectId にすることができますが、そうである必要はありません。一意であることを保証できる限り、他の値を _id として使用することもできます。したがって、データに既に自然キーがある場合は、必要に応じてこれを _id として使用できます。

于 2014-07-14T16:58:50.927 に答える