Меняется ли поле _id в MongoDB при копировании данных из одной коллекции в другую?

Мы планируем использовать MongoDB _id в качестве ключа, который мы предоставим клиенту. Следовательно, требуется, чтобы этот ключ не изменялся, если нам когда-либо понадобится переместить данные из одной коллекции в другую. Копирование будет выполнено с использованием db.copyDatabase () или mongoimport.

Один из способов копирования данных из одной коллекции в другую - это перебор документов в первой коллекции (C1) и вставка этих документов во вторую коллекцию (C2). В этом случае _id должен оставаться таким же (в C2), потому что он будет присутствовать в документах (из C1), которые вставляются (так же, как и в случае, когда мы сами предоставляем _id).

Однако, если есть альтернативный способ копирования документов, _id может измениться, поскольку он зависит от:

(1) Временная метка UNIX (2) Идентификатор компьютера (3) ProcessId

(** Это должно произойти только в том случае, если MongoDB при копировании удаляет _id из документов в C1 и регенерирует их при вставке в C2?)

Мы хотим, чтобы значения _id были одинаковыми независимо от расположения целевой коллекции: (1) в одной базе данных (2) в другой базе данных - на одном компьютере (3) в другой базе данных - на другом компьютере)

Спасибо


person arozz90    schedule 14.07.2014    source источник


Ответы (1)


Нет, числа _id не изменятся.

Новый ObjectId создается, когда в базу данных вставляется документ без поля _id. Когда вы вставляете документ, в котором уже есть поле _id, MongoDB не трогает его.

Отметка времени, идентификатор компьютера и идентификатор процесса относятся к тем, где был сгенерирован ObjectID. Это может быть сервер базы данных, но он также может быть сгенерирован драйвером MongoDB на сервере приложений. В этом случае MongoDB не изменит его самостоятельно.

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

person Philipp    schedule 14.07.2014
comment
Хороший ответ. Следует ли использовать _id вместо ObjectId в последнем предложении? - person JohnnyHK; 15.07.2014