2012-01-04 12 views
17

Kiedy używam Mongodb z Javą, chcę wygenerować identyfikator obiektu na klientach. Zanim jednak wstawię rekord, muszę najpierw zapytać o mongodbę, aby upewnić się, że identyfikator generowany przez metodę ObjectId() jest unikalny. Czy jest jakiś sposób, aby wygenerować unikalny identyfikator obiektu bez uzyskiwania dostępu do mongodb dwa razy?Jak wygenerować unikalny identyfikator obiektu w mongodb

Odpowiedz

18

Identyfikatory obiektów nie przypominają identyfikatorów sekwencyjnych używanych w RDMS. Jeśli są prawidłowo wygenerowane zgodnie z Object ID specification, nie musisz się martwić, że są unikatowe.

Wszystko, co musisz zrobić, to upewnić się, że zawsze tworzysz nowy identyfikator obiektu, zamiast go ponownie wykorzystywać.

+2

Więc jeśli generuję identyfikator przez: Id identyfikatora obiektu = nowy ObjectId(); to identyfikator musi być już unikatowy? Dziękuję – NOrder

+1

@vienna Poprawnie. Trzeba tylko upewnić się, aby wywoływać go za każdym razem, gdy zapisujesz rekord w bazie danych. –

42

Możesz wygenerować ObjectId na kliencie bez konsultacji z bazą danych. Identyfikator taki będzie unikalny (będziesz musiał bardzo się starać, aby uzyskać dwa identyczne identyfikatory obiektów).

ObjectId id = new ObjectId(); 

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

Tam różnicy między tymi dwoma sposobami? Pozdrawiam – DanielPanic

+0

Bez różnicy. ObjectId # get just wywołuje konstruktora. –

+0

jak to działa? czy to javascript? – Jennifer

4

Od MongoDB Java Driver 3.3.0, istnieją następujące sposoby tworzenia ObjectIds.

Korzystanie z konstruktora bez parametrów:dostarcza unikalnych objectID

1. ObjectId id1 = new ObjectId(); //Generates unique id 

    1.1. ObjectId id2 = ObjectId.get(); //Calls new ObjectId(); 

Korzystanie parametryzowanej konstruktorów:parametry wpływają na wyjątkowość 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. 

Understanding CEL d:

ObjectId składa się z 12 bajtów dzieli się następująco:

   ObjectID layout 

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

|time   |machine |pid |inc  | 
Powiązane problemy