2012-01-04 82 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  |