Mongodb 主キー: ObjectId() を使用して _id フィールドを設定する例
⚡ スマートサマリー
MongoDB プライマリキーは、コレクション内のすべてのドキュメントを一意に識別する_idフィールドです。デフォルトでは自動生成されたObjectIdが格納されますが、ドキュメントを挿入する際に_idフィールドに独自の値を割り当てることもできます。

主キーとは何ですか MongoDB?
In MongoDB, _id フィールドをコレクションの主キーとして使用し、コレクション内で各ドキュメントを一意に識別できるようにします。 _id フィールドには、一意の ObjectID 値が含まれます。
デフォルトでは、コレクションにドキュメントを挿入するときに、フィールド名に _id を含むフィールド名を追加しないと、 MongoDB 以下に示すように、オブジェクト ID フィールドが自動的に追加されます。
コレクション内のドキュメントをクエリすると、コレクション内の各ドキュメントの ObjectId を確認できます。
それを確実にしたい場合は、 MongoDB は、コレクションの作成時に _id フィールドを作成しません。コレクションの _id として独自の ID を指定する場合は、コレクションの作成時にこれを明示的に定義する必要があります。
id フィールドを明示的に作成する場合は、名前に _id を付けて作成する必要があります。
これを実現する方法の例を見てみましょう。
db.Employee.insert({_id:10, "EmployeeName" : "Smith"})
Code 説明:
- コレクション内の最初のドキュメントを作成していると想定しているため、コレクションの作成中に上記のステートメントでフィールド _id を明示的に定義し、その値を定義します。
コマンドが正常に実行され、findコマンドを使用してコレクション内のドキュメントを表示すると、次の出力が表示されます。
出力:
出力は、コレクションの作成時に定義した _id フィールドがコレクションの主キーとして使用されていることを明確に示しています。
ObjectId とは何ですか MongoDB?
ObjectId はデフォルト値のタイプです。 MongoDB _id プライマリキーに割り当てます。これは 12 バイトの識別子で、サーバーとコレクション全体でグローバルに一意になるように設計されているため、2 つのドキュメントが同じ値を受け取ることはほとんどありません。クライアント ドライバーはサーバーに問い合わせることなく ObjectId を生成できるため、 MongoDB 中央カウンターなしで、多数のマシンに迅速にドキュメントを挿入し、拡張できます。
各ObjectIdはコンパクトなバイナリ形式で格納されますが、例えばObjectId(“507f1f77bcf86cd799439011”)のように、24文字の16進数文字列として表示されます。最初のバイトは現在時刻に基づいており、ドキュメントが作成されるにつれて値が着実に増加します。これにより、ObjectIdは一意であるだけでなく、挿入順におおよそソートできるため、最新のレコードや最も古いレコードを最初に表示したい場合に便利です。
の構造 MongoDB オブジェクト ID
A MongoDB ObjectIdは正確に12バイトの長さで、各部分にはそれぞれ特定の意味があります。この構造を理解することで、ObjectIdが一意であり、時間順に並んでいる理由が理解できます。
- 4バイトのタイムスタンプ: Unixエポックからの秒数。ObjectIdが作成された時刻を記録します。これにより、IDを時間順に並べ替えることができます。
- 5バイトのランダム値: プロセスごとに一度生成される値で、マシンとプロセスの識別子を組み合わせたものであるため、クライアントごとに異なるIDが生成されます。
- 3バイトインクリメントカウンタ: ランダムな値から始まり、同じ秒内に新しいオブジェクトIDが追加されるたびに増加するカウンター。これにより、高速挿入時の衝突を防ぎます。
これら3つの要素が連携することで、複数のサーバー間で同時に多数のドキュメントが挿入された場合でも、すべてのObjectIdが一意であることが保証されます。ObjectIdに対してgetTimestamp()メソッドを呼び出すことで、埋め込まれた作成時刻をいつでも読み取ることができます。
ObjectIdを主キーとして使用する利点
デフォルトの ObjectId を _id 主キーとして使用すると、いくつかの実用的な利点があります。 MongoDB コレクションはそれに依存しています。
- 自動生成: キー値を自分で作成したり管理したりする必要がないため、重複するキーが発生する可能性が低くなります。
- 世界的にユニークな点: ObjectIDはサーバー間で一意性を保つため、分散環境やシャーディング環境でもうまく機能します。
- 内蔵タイムスタンプ: 埋め込まれた作成時刻により、追加の日付フィールドなしで、文書を経過時間で並べ替えたり、フィルタリングしたりできます。
- ハイパフォーマンス: クライアント側での生成により、サーバーへの往復通信が回避され、ping 素早く挿入できます。
ObjectIdはほとんどのアプリケーションに適していますが、クエリを簡素化できる自然なビジネスキー(メールアドレスや製品コードなど)を使用する場合は、カスタムIDを選択することもできます。最適な選択は、データの検索方法や関連付け方法によって異なります。


