【发布时间】:2017-03-19 02:00:35
【问题描述】:
当我在 Java 中使用 Mongodb 时,我想在客户端生成 Object id。但是,在插入记录之前,我必须先查询 mongodb 以确保 ObjectId() 方法生成的 id 是唯一的。有什么方法可以在不访问 mongodb 两次的情况下生成唯一的对象 ID?
【问题讨论】:
当我在 Java 中使用 Mongodb 时,我想在客户端生成 Object id。但是,在插入记录之前,我必须先查询 mongodb 以确保 ObjectId() 方法生成的 id 是唯一的。有什么方法可以在不访问 mongodb 两次的情况下生成唯一的对象 ID?
【问题讨论】:
您可以在客户端生成 ObjectId 而无需咨询数据库。这样的 ID 将是唯一的(您必须非常努力地获得两个相同的对象 ID)。
ObjectId id = new ObjectId();
// or this
ObjectId id = ObjectId.get();
【讨论】:
对象 ID 与您在 RDMS 中使用的顺序 ID 不同。如果它们是根据Object ID specification 正确生成的,则您无需担心它们是唯一的。
您所要做的就是确保始终创建一个新的对象 ID 而不是重复使用它们。
【讨论】:
从 MongoDB Java Driver 3.3.0 开始,ObjectId 的创建方式有以下几种。
使用不带参数的构造函数: 提供唯一的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 |
【讨论】: