Когда я использую Mongodb с Java, я хочу сгенерировать Object ID у клиентов. Однако, прежде чем вставить запись, я сначала должен запросить mongodb, чтобы убедиться, что идентификатор, сгенерированный методом ObjectId(), уникален. Есть ли способ, с помощью которого я могу генерировать уникальный идентификатор объекта без одновременного доступа к mongodb?
Как создать уникальный идентификатор объекта в mongodb
Ответ 1
Идентификаторы объектов не похожи на последовательные идентификаторы, используемые в RDMS. Если они должным образом созданы в соответствии с спецификацией идентификатора объекта, вам не нужно беспокоиться о том, что они уникальны.
Все, что вам нужно сделать, это убедиться, что вы всегда создаете новый идентификатор объекта, а не повторно используете его.
Ответ 2
Вы можете генерировать ObjectId на клиенте без консультации с базой данных. Такой идентификатор будет уникальным (вам придется пробовать чертовски сложно получить две идентичные идентификаторы объектов).
ObjectId id = new ObjectId();
// or this
ObjectId id = ObjectId.get();
Ответ 3
Начиная с 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 |