2012-01-04 81 views
17

当我在Java中使用Mongodb时,我想在客户端生成Object id。然而,在插入记录之前,我必须首先查询mongodb,以确保由ObjectId()方法生成的id是唯一的。有没有什么办法可以生成唯一的对象ID,而无需两次访问mongodb?如何在mongodb中生成唯一的对象ID

回答

18

对象ID不像您在RDMS中使用的顺序标识。如果它们根据Object ID specification正确生成,则不必担心它们是唯一的。

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

+2

所以如果我通过生成id:ObjectId id = new ObjectId(); 那么这个ID必须是唯一的?谢谢 – NOrder 2012-01-04 07:48:00

+1

@vienna正确。每次将记录保存到数据库时,都必须确保调用它。 – 2012-01-04 07:55:11

42

您可以在不咨询数据库的情况下在客户端上生成ObjectId。这样的ID将是唯一的(你将不得不努力获得两个相同的对象id)。

ObjectId id = new ObjectId(); 

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

即使世界那些两种方法之间的差异?欢呼声 – DanielPanic 2015-04-01 10:42:20

+0

没有区别。 ObjectId#只是调用构造函数。 – 2016-01-19 12:18:13

+0

这是如何工作的?这是JavaScript吗? – Jennifer 2016-01-21 04:22:45

4

从MongoDB Java Driver 3.3.0开始,有以下几种创建ObjectIds的方法。

使用不带参数的构造函数:提供独特的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. 

理解ObjectI的独特性d:

的ObjectId有12个字节,划分如下:

   ObjectID layout 

0 1 2 3 4 5 6 7 8 9 10 11 

|time   |machine |pid |inc  |