Node-mongodb-native создает последовательные идентификаторы объектов

Так или иначе mongod-native создает последовательные идентификаторы объектов для вставленных объектов. Я бы предпочел, чтобы база данных могла выполнять эту работу, или mongodb-native мог по крайней мере использовать ту же стратегию генерации, что и db.

Вставка с урожаями mongodb-native:

"_id" : ObjectId("520cc99c00bd49c20180aad0")
"_id" : ObjectId("520cc99c00bd49c20180aad1")
"_id" : ObjectId("520cc99c00bd49c20180aad2")

Вставка в ту же коллекцию с использованием оболочки дает реальный идентификатор:

"_id" : ObjectId("520cc9f25aea0256082427e9")

Чем это вызвано? Разве это не большая проблема для репликации/осколки?

Btw. я использую

db: {
 forceServerObjectId: true
}

уже с единственным эффектом, что _id не задан на объекте в узле...

2 ответа

Сначала рассмотрим байты объекта ObjectId:

ObjectId is a 12-byte BSON type, constructed using:

a 4-byte value representing the seconds since the Unix epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.

Таким образом, если вы быстро создадите серию ObjectId на одной машине, вы в конечном итоге ObjectId практически тот же _id поскольку он будет содержать почти одинаковые байты, за исключением 3-байтового счетчика (в качестве метки времени, идентификатора процесса, а идентификатор машины будет одинаковым).

Большинство драйверов/клиентов MongoDB создают по умолчанию _id по-умолчанию, а не на сервере базы данных (и поскольку все они с открытым исходным кодом, вы можете взглянуть на каждую из реализаций, чтобы увидеть особенности создания _id., это требует немного копания. Здесь, например, для NodeJS).

_id который был сгенерирован из оболочки, не более "реальный", чем _id сгенерированный клиентом. У них просто разные значения посева (идентификаторы машины и процесса, конечно, будут разными).

Используя ObjectId для sharding, начиная с 2. 4+ у вас есть два варианта: диапазон и хеш. У каждого есть плюсы и минусы и, в конечном счете, либо работают очень хорошо, в зависимости от характера писем, чтений, запросов и т.д., Которые необходимы. Вы можете узнать больше об этом здесь.


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

Поскольку поле _id всегда индексируется и первичный ключ, вам нужно убедиться, что для каждого объекта создается другой объект. Существуют некоторые рекомендации по оптимизации идентификаторов объектов, определенных пользователем:

http://docs.mongodb.org/manual/core/document/#record-documents

http://docs.mongodb.org/manual/reference/object-id/

licensed under cc by-sa 3.0 with attribution.