2

私は Mongodb を初めて使用するので、mongodb ID について混乱しています。

  1. Mysql では、任意の変数を主キーとして定義できます。そのように mongodb で任意の変数を主キーとして定義することは可能ですか?

  2. コンソールでは、_id を _id : objectId("4c4ba5c0672c685e5e8aabf3") として定義します。php.で同じことを行う方法と、それがどこから来た引数(「4c4ba5c0672c685e5e8aabf3」)は何ですか? 関数によってこの引数を生成する方法はありますか?

4

2 に答える 2

2

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 を作成する必要がある場合は、それを単一のコンストラクター引数として渡すことができます (上記のクエリで行ったように)。

于 2013-04-08T22:48:16.780 に答える
0

http://docs.mongodb.org/manual/reference/object-id/ :

ObjectId は 12 バイトの BSON タイプで、以下を使用して構築されます。

  • Unix エポックからの秒数を表す 4 バイトの値。
  • 3 バイトのマシン ID、
  • 2 バイトのプロセス ID、および
  • ランダムな値で始まる 3 バイトのカウンター。

http://www.php.net/manual/en/class.mongoid.phphttp://www.php.net/manual/en/mongocollection.ensureindex.php

于 2013-04-08T13:56:38.517 に答える