Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在mongodb中生成唯一的对象id_Java_Mongodb - Fatal编程技术网

Java 如何在mongodb中生成唯一的对象id

Java 如何在mongodb中生成唯一的对象id,java,mongodb,Java,Mongodb,当我在Java中使用Mongodb时,我想在客户端生成对象id。但是,在插入记录之前,我必须首先查询mongodb,以确保ObjectId()方法生成的id是唯一的。有没有任何方法可以在不访问mongodb两次的情况下生成唯一的对象id?您可以在客户端上生成ObjectId,而无需咨询数据库。这样的ID是唯一的(您必须尽最大努力获得两个相同的对象ID) 对象ID与RDMS中使用的顺序ID不同。如果它们是根据规则正确生成的,您就不必担心它们是唯一的 您所要做的就是确保始终创建新的对象ID,而不是重

当我在Java中使用Mongodb时,我想在客户端生成对象id。但是,在插入记录之前,我必须首先查询mongodb,以确保ObjectId()方法生成的id是唯一的。有没有任何方法可以在不访问mongodb两次的情况下生成唯一的对象id?

您可以在客户端上生成ObjectId,而无需咨询数据库。这样的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      |