MongodbをJavaで使用する際、クライアント側でオブジェクトIDを生成したいのですが、どうすればよいでしょうか?しかし、レコードを挿入する前に、ObjectId()メソッドで生成されたidがユニークであることを確認するために、最初にmongodbに問い合わせをする必要があります。mongodbに2回アクセスすることなく、一意のオブジェクトIDを生成する方法はありますか?
データベースを参照することなく、クライアント側でObjectIdを生成することができます。このIDはユニークなものです(2つの同じオブジェクトIDを得るには、相当な努力が必要です)。
ObjectId id = new ObjectId();
// or this
ObjectId id = ObjectId.get();
オブジェクトIDは、RDMSで使用するシーケンシャルIDとは異なります。オブジェクトID仕様][1]に従って適切に生成されていれば、一意であることを気にする必要はないでしょう。
再利用するのではなく、常に新しいObject IDを作成するようにすればよいのです。
[1]: http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification "オブジェクトID仕様"。
MongoDB Java Driver 3.3.0 では、ObjectIds を作成する方法として以下のものがあります。
パラメータなしのコンストラクタを使用する場合: * 一意の ObjectId を提供します。
1. ObjectId id1 = new ObjectId(); //Generates unique id
1.1. ObjectId id2 = ObjectId.get(); //Calls new ObjectId();
**パラメータ化されたコンストラクタの使用:** パラメータは ObjectId の一意性に影響します。
2. public ObjectId(byte[] bytes) // Receives a byte array of size 12.
3. public ObjectId(String hexString) //Receives a String that is a hexadecimal representation of 12 bytes.
4. public ObjectId(Date date) // Receives a Date object
5. public ObjectId(Date date, int counter) //Receives date and a counter
6. public ObjectId(Date date,
int machineIdentifier,
short processIdentifier,
int counter) //Receives Date, MachineId, PID and counter.
7. public ObjectId(int timestamp,
int machineIdentifier,
short processIdentifier,
int counter) //Receives Epoch time in sec, MachineId, PID and counter.
ObjectIdを理解する:。
ObjectIdは12バイトで構成され、以下のように分割されます。
ObjectID layout
0 1 2 3 4 5 6 7 8 9 10 11
|time |machine |pid |inc |