MongoDB のドキュメントには_id
フィールドが必要であり、その値は不変でコレクションに固有です。PHP がMongoIdクラスとして表すObjectId型は、通常、このフィールドに使用されます。その構成により、UUID と同様に、クラスター全体で一意性を確保するのに適しています。
コレクションに格納されたドキュメントの構造について説明しているレコード ドキュメントのドキュメントを読むと、配列を除いて、任意の BSON 値を として使用できることがわかります_id
(MongoDB が配列フィールドのインデックスを処理する方法による)。 . 同じコレクション内では、ドキュメント全体で異なる ID タイプを自由に使用できますが、個人の健全性のために一貫性を保つことをお勧めします。
// Allowed
db.foo.insert({ _id: 1 })
db.foo.insert({ _id: 'abc' })
db.foo.insert({ _id: ObjectId() })
db.foo.insert({ _id: { x: 1, y: 2 }})
db.foo.insert({ _id: { x: 1, o: ObjectId() }})
db.foo.insert({ _id: { x: 1, a: [1, 2, 3] }})
// Not allowed
db.foo.insert({ _id: [1, 2, 3] })
db.foo.insert({ _id: ['a', ObjectId()] })
多くの場合、ObjectId は 24 文字の 16 進文字列として出力されますが、実際には独自のBSON タイプ(12 バイトのバイナリ値) であることを覚えておくことが重要です。PHP で ObjectId を使用してドキュメントをクエリする場合は、次のように MongoId 値で照合する必要があります。
// Matches
$collection->findOne([ '_id' => new MongoId('4c4ba5c0672c685e5e8aabf3') ]);
// Doesn't match (unless a document's ID was really that string
$collection->findOne([ '_id' => '4c4ba5c0672c685e5e8aabf3' ]);
最後に、PHP で ObjectId を生成したい場合は、コンストラクターに引数を渡さずに、好きなように MongoId インスタンスを簡単に作成できます。MongoId クラスには__toString()
メソッドがあるため、それを文字列にキャストして 24 文字の文字列表現を取得することもできます。同様に、24 文字の文字列から MongoId を作成する必要がある場合は、それを単一のコンストラクター引数として渡すことができます (上記のクエリで行ったように)。