Java 如何在mongodb中生成唯一的对象id
当我在Java中使用Mongodb时,我想在客户端生成对象id。但是,在插入记录之前,我必须首先查询mongodb,以确保ObjectId()方法生成的id是唯一的。有没有任何方法可以在不访问mongodb两次的情况下生成唯一的对象id?您可以在客户端上生成ObjectId,而无需咨询数据库。这样的ID是唯一的(您必须尽最大努力获得两个相同的对象ID)Java 如何在mongodb中生成唯一的对象id,java,mongodb,Java,Mongodb,当我在Java中使用Mongodb时,我想在客户端生成对象id。但是,在插入记录之前,我必须首先查询mongodb,以确保ObjectId()方法生成的id是唯一的。有没有任何方法可以在不访问mongodb两次的情况下生成唯一的对象id?您可以在客户端上生成ObjectId,而无需咨询数据库。这样的ID是唯一的(您必须尽最大努力获得两个相同的对象ID) 对象ID与RDMS中使用的顺序ID不同。如果它们是根据规则正确生成的,您就不必担心它们是唯一的 您所要做的就是确保始终创建新的对象ID,而不是重
对象ID与RDMS中使用的顺序ID不同。如果它们是根据规则正确生成的,您就不必担心它们是唯一的
您所要做的就是确保始终创建新的对象ID,而不是重复使用它们。从MongoDB Java Driver 3.3.0开始,有以下几种方法可以创建对象ID 使用不带参数的构造函数:提供唯一的ObjectId 使用参数化构造函数:参数影响ObjectId的唯一性 理解ObjectId: ObjectId由12个字节组成,划分如下:
ObjectID layout
0 1 2 3 4 5 6 7 8 9 10 11
|time |machine |pid |inc |
因此,如果我通过以下方式生成id:ObjectId id=newobjectid();那么id必须是唯一的了?感谢you@vienna对的您只需确保每次将记录保存到数据库时都调用它,没有区别。ObjectId#get只调用构造函数。@Jennifer:这是java,不是javascript。在具有停靠进程(相同PID)的高度并发设置中,此过程可能很危险,导致ID冲突。不太可能,对“NetworkInterface.getNetworkInterfaces()”的调用将不得不失败,从而导致ID的随机machiene部分。但你不能足够确定,对吗?@AndréB.嗯,你是什么意思,相同的pid?(我不知道docker:))在docker容器中,PID从零开始,尝试运行“docker run ubuntu ps ax”。这不再是结构。根据此处当前的impl文档(),12个字节的格式是4个字节:时间,5个字节:随机,3个字节:计数器
1. ObjectId id1 = new ObjectId(); //Generates unique id
1.1. ObjectId id2 = ObjectId.get(); //Calls new 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 layout
0 1 2 3 4 5 6 7 8 9 10 11
|time |machine |pid |inc |