MongoDB の ObjectId と $Oid の違い
MongoDB は、すべてのデータ レコードを個々の BSON ドキュメントに格納します。 各ドキュメントを一意に識別するための識別子が提供されます。
識別子は、ユーザーが他のドキュメントを検索するときにドキュメントを一意に見つけるのに役立ちます。
クエリは識別子の助けを借りて簡単に機能し、それに応じて結果が生成されます。
すべてのコレクションで、各ドキュメントには、主キーとして機能する一意の _id
フィールドがあります。 _id
のデフォルト形式は、ドキュメントの ObjectID
です。
ObjectID
の機能
ObjectID
は、特定のコレクション内の個々のドキュメントの識別子として機能します。 ObjectID
は 12 バイトの BSON タイプ フィールドです。
フィールドの分割は次のとおりです。
- 個々のドキュメントの Unix タイムスタンプは、最初の 4 バイトで表されます。
- MongoDB サーバーが現在稼働しているマシン ID は、次の 3 バイトで表されます。
- プロセス ID は、次の 2 バイトで表されます。
ObjectID
をインクリメントするために、最後の 3 バイトが予約されています。
ObjectID
のフォーマット
ObjectID
は、ドキュメントの作成時に定義できます。 ObjectID
をドキュメントに割り当てる方法は 2つあります。
- 作成時に、ユーザーは
ObjectID
をドキュメント自体に割り当てます。 - ドキュメントは、MongoDB サーバーによって割り当てられたデフォルトの
ObjectID
を取ります。
ObjectID
は次の形式で定義されます。
ObjectId(<hexadecimal>)
ObjectID
を定義する <hexadecimal>
パラメータはオプションです。 ユーザーが _id
フィールドで値を定義すると、その値は ObjectID
としてドキュメントに割り当てられます。
それ以外の場合、MongoDB サーバーはドキュメントに ID を提供します。
注: ユーザーが提供する
ObjectID
は、コレクション内の各ドキュメントに対して一意である必要があります。
MongoDB における ObjectID
と $oid
の違い
MongoDB サーバーでは、ObjectID
と $oid
に違いはありません。 この 2つは、新しいシェルで導入されたシリアル化形式が異なるだけです。
オブジェクト ID は、MongoDB サーバーの $oid
の助けを借りて表されます。 サーバーは Strict MongoDB Extended JSON
を使用します。 したがって、オブジェクト ID は次のように表されます。
{ "$oid": "<id>" }
上に示したように、特定のドキュメントを検索するときに $oid
用語を使用できます。 クエリの作成中に $oid
を使用できます。
一方、ObjectID
はドキュメントの作成に使用できます。 さらに、ObjectID
のメソッドを使用して、12 バイト長のオブジェクト ID から特定の値を取得できます。
つまり、MongoDB サーバーの 2つのエンティティに大きな違いはありません。
ObjectID
を使用してコレクションにドキュメントを挿入する
前のセクションで説明したように、ObjectID
フィールドはオプションの hexadecimal
パラメータを取ります。 ドキュメントの作成時に _id
フィールドの値が設定されていない場合、MongoDB サーバーはコレクション内のドキュメントにデフォルトの一意の値を設定します。
コレクションに単一のドキュメントを挿入する構文は次のとおりです。
db.collectionName.insertOne()
コード スニペットは、サーバーによって設定された _id
フィールドのデフォルト値を使用して、コレクションに 1つのドキュメントを挿入します。
コレクションに複数のドキュメントを挿入する構文は次のとおりです。
db.collectionName.insertMany()
コード スニペットは、サーバーによって設定された _id
フィールドのデフォルト値を使用して、コレクションにいくつかのドキュメントを挿入します。
ObjectID
フィールドを設定する
ユーザーは、ドキュメントを作成するときに _id
フィールドを設定できます。 ObjectID
または $oid
を設定する構文は次のとおりです。
db.collectionname.insertOne({"_id":"1789473"})
コレクション内のドキュメントの ObjectID
を設定する例を次に示します。 次のエンティティを想定します。
- データベースの名前:
officedb
- コレクションの名前:
employee_officedb
次のコマンドを使用して、MongoDB サーバーでドキュメントを作成します。
> use officedb
switched to db officedb
> db.createCollection("employee_officedb")
{ "ok" : 1 }
> db.employee_officedb.insert({ name : "asad", rank : 23})
WriteResult ({ "nInserted" : 1})
> db.employee_officedb.find().pretty()
{
"_id" : ObjectId ("8e12bn2a0ty562888ab93711"),
"name" : "asad"
"rank" : 23
}
ObjectID
のメソッド
4つのメソッドは、MongoDB の ObjectID
の概念を拡張します。 以下で説明するように、各メソッドは異なる機能を提供します。
str
メソッド: これは、オブジェクト ID を 16 進文字列形式で取得するために使用されます。ObjectId.getTimestamp()
メソッドは、オブジェクトのタイムスタンプ部分を日付として返します。ObjectId.valueOf()
メソッド: このメソッドは、指定された文字列リテラルの 16 進形式を返します。ObjectId.toString()
メソッド: このメソッドは、オブジェクト ID を JavaScript 表現の文字列形式で返します。
まとめ
MongoDB サーバーには、ObjectID
と $oid
を探索する大きな余地があります。 表現を除いて、両者の間に大きな違いはありません。
ObjectID
を使用するシェルもあれば、$oid
を使用するシェルもあります。 したがって、データの操作と保存は、デバイスにインストールされているシェルのバージョンによって異なります。
ドキュメントとその ID の定義には、ObjectID
を使用します。 一方、クエリの作成と実行中に、$oid
を使用してコレクション全体を検索し、必要なドキュメントを見つけます。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub