MongoDB の ObjectId と $Oid の違い

Bilal Shahid 2023年6月20日
  1. ObjectID の機能
  2. MongoDB における ObjectID$oid の違い
  3. ObjectID を使用してコレクションにドキュメントを挿入する
  4. ObjectID のメソッド
  5. まとめ
MongoDB の ObjectId と $Oid の違い

MongoDB は、すべてのデータ レコードを個々の BSON ドキュメントに格納します。 各ドキュメントを一意に識別するための識別子が提供されます。

識別子は、ユーザーが他のドキュメントを検索するときにドキュメントを一意に見つけるのに役立ちます。

クエリは識別子の助けを借りて簡単に機能し、それに応じて結果が生成されます。

すべてのコレクションで、各ドキュメントには、主キーとして機能する一意の _id フィールドがあります。 _id のデフォルト形式は、ドキュメントの ObjectID です。

ObjectID の機能

ObjectID は、特定のコレクション内の個々のドキュメントの識別子として機能します。 ObjectID は 12 バイトの BSON タイプ フィールドです。

フィールドの分割は次のとおりです。

  1. 個々のドキュメントの Unix タイムスタンプは、最初の 4 バイトで表されます。
  2. MongoDB サーバーが現在稼働しているマシン ID は、次の 3 バイトで表されます。
  3. プロセス ID は、次の 2 バイトで表されます。
  4. ObjectID をインクリメントするために、最後の 3 バイトが予約されています。

ObjectID のフォーマット

ObjectID は、ドキュメントの作成時に定義できます。 ObjectID をドキュメントに割り当てる方法は 2つあります。

  1. 作成時に、ユーザーは ObjectID をドキュメント自体に割り当てます。
  2. ドキュメントは、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 を設定する例を次に示します。 次のエンティティを想定します。

  1. データベースの名前: officedb
  2. コレクションの名前: 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 の概念を拡張します。 以下で説明するように、各メソッドは異なる機能を提供します。

  1. str メソッド: これは、オブジェクト ID を 16 進文字列形式で取得するために使用されます。
  2. ObjectId.getTimestamp() メソッドは、オブジェクトのタイムスタンプ部分を日付として返します。
  3. ObjectId.valueOf() メソッド: このメソッドは、指定された文字列リテラルの 16 進形式を返します。
  4. ObjectId.toString() メソッド: このメソッドは、オブジェクト ID を JavaScript 表現の文字列形式で返します。

まとめ

MongoDB サーバーには、ObjectID$oid を探索する大きな余地があります。 表現を除いて、両者の間に大きな違いはありません。

ObjectID を使用するシェルもあれば、$oid を使用するシェルもあります。 したがって、データの操作と保存は、デバイスにインストールされているシェルのバージョンによって異なります。

ドキュメントとその ID の定義には、ObjectID を使用します。 一方、クエリの作成と実行中に、$oid を使用してコレクション全体を検索し、必要なドキュメントを見つけます。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

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

関連記事 - MongoDB ObjectId