如何在MongoDB中生成唯一的对象ID

39

当我使用Java与Mongodb时,我想在客户端生成对象ID。然而,在插入记录之前,我必须先查询mongodb,以确保ObjectId()方法生成的ID是唯一的。有没有办法只访问一次mongodb就生成唯一的对象ID?

3个回答

70

你可以在客户端生成ObjectId而无需查询数据库。这样的ID将是唯一的(你必须极力尝试才能获得两个相同的对象ID)。

ObjectId id = new ObjectId();

// or this
ObjectId id = ObjectId.get();

1
没有区别。ObjectId#get 只是调用构造函数。 - Håvard Geithus
1
@Jennifer:这是Java,不是JavaScript。 - Sergio Tulentsev
在高度并发的Docker进程设置中(相同的PID),这个过程可能是危险的,导致ID冲突。虽然很不可能,而且调用“NetworkInterface.getNetworkInterfaces()”也会失败,导致ID的随机机器部分。但你不能确定得足够吧? - André B.
@AndréB. 呃,你是说相同的 pid 吗?(我对 Docker 没有任何了解 :) ) - Sergio Tulentsev
在 Docker 容器中,进程 ID 从零开始,尝试运行 "docker run ubuntu ps ax"。 - André B.

30

对象ID不像您在关系型数据库中使用的顺序ID一样。如果它们根据对象ID规范正确生成,则无需担心其唯一性。

您需要做的就是确保始终创建新的对象ID而不是重复使用它们。


5
如果我通过使用“ObjectId id = new ObjectId();”生成id,那么id必须已经是唯一的了吗?谢谢。 - NOrder
2
@vienna 正确。你只需要确保每次将记录保存到数据库时都调用它。 - Zachary Anker

13

从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      |

2
这不再是原来的结构。根据当前的实现文档(https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification),12个字节的格式为4个字节:时间,5个字节:随机数,3个字节:计数器。 - Rondo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接