Как создать уникальный идентификатор объекта в mongodb - PullRequest
26 голосов
/ 04 января 2012

Когда я использую Mongodb с Java, я хочу генерировать идентификатор объекта на клиентах. Однако прежде чем вставлять запись, я должен сначала выполнить запрос к mongodb, чтобы убедиться, что идентификатор, сгенерированный методом ObjectId (), уникален. Можно ли как-нибудь сгенерировать уникальный идентификатор объекта, не обращаясь к mongodb дважды?

Ответы [ 3 ]

51 голосов
/ 04 января 2012

Вы можете генерировать ObjectId на клиенте без обращения к базе данных. Такой идентификатор будет уникальным (вам придется чертовски стараться получить два идентичных идентификатора объекта).

ObjectId id = new ObjectId();

// or this
ObjectId id = ObjectId.get();
23 голосов
/ 04 января 2012

Идентификаторы объектов не похожи на последовательные идентификаторы, которые вы используете в RDMS. Если они правильно сгенерированы в соответствии со спецификацией Object ID , вам не нужно беспокоиться об их уникальности.

Все, что вам нужно сделать, это убедиться, что вы всегда создаете новый идентификатор объекта, а не используете его повторно.

6 голосов
/ 20 сентября 2016

Начиная с 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.

Понимание ObjectId:

ObjectId состоит из 12 байтов, разделенных следующим образом:

               ObjectID layout

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

|time          |machine    |pid    |inc      |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...