When I use Mongodb with Java, I want to generate Object id at clients. Before I insert a record, however, I have to query mongodb first to make sure that the id generated by ObjectId() method is unique. Is there any way that I can generate unique object id without accessing mongodb twice?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Object IDs are not like sequential ids you use in a RDMS. If they are properly generated according to the Object ID specification you will not need to worry about them being unique.
All you have to do is ensure you always create a new Object ID rather than reusing them.
回答2:
You can generate ObjectId on the client without consulting database. Such ID will be unique (you'll have to try damn hard to get two identical object ids).
ObjectId id = new ObjectId();
// or this
ObjectId id = ObjectId.get();
回答3:
As of MongoDB Java Driver 3.3.0, there are the following ways to create ObjectIds.
Using the constructor without parameters: Provides unique ObjectId
1. ObjectId id1 = new ObjectId(); //Generates unique id
1.1. ObjectId id2 = ObjectId.get(); //Calls new ObjectId();
Using the parameterized constructors: Parameters influence the uniqueness of the 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.
Understanding ObjectId:
ObjectId consists of 12 bytes, divided as follows:
ObjectID layout
0 1 2 3 4 5 6 7 8 9 10 11
|time |machine |pid |inc |