Это плохая практика - устанавливать мой собственный MongoDB _id по уникальному идентификатору документа? - PullRequest
0 голосов
/ 27 августа 2018

Я получаю и храню массив объектов JSON, например:

$json_assoc_array = array (
    {
        'id' => "unique-id-1",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    {
        'id' => "unique-id-2",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    {
        'id' => "unique-id-3",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    }
); 

И позже я буду получать обновления этих объектов в том же формате.Мне нужно обновить объекты / документы по их полю id.

Когда я вставляю их в MongoDB с помощью простого insertMany, они также получают уникальный объект MongoDB _id s, поэтому результирующие документы выглядят так:

$json_assoc_array = array (
    {
        '_id' => "5b824c113e2ffc4e7239bfc5"
        'id' => "unique-id-1",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    {
        '_id' => "5b824c1b3e2ffc4e7239caa2"
        'id' => "unique-id-2",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    {
        '_id' => "5b824c1b3e2ffc4e7239caa3"
        'id' => "unique-id-3",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    }
); 

Там никогда не будетбыть другим документом с идентификатором unique-id-1.Итак, я сейчас устанавливаю их перед их первоначальной вставкой, например:

$json_assoc_array = json_decode($data, true);

// Set order MongoDB _id
$json_assoc_array['_id'] = $json_assoc_array['id'];

// Set MongoDB collection
$collection = $mongo->mongo_db_name->collection;

// Insert documents into MongoDB
$result = $collection->insertMany( $json_assoc_array );

// Now when I insert the above documents, they result in this
$json_assoc_array = array (
    {
        '_id' => "unique-id-1"
        'id' => "unique-id-1",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    {
        '_id' => "unique-id-2"
        'id' => "unique-id-2",
        'key_one' => "some value",
        'key_two' => "some value",
        'key_three' => "some value"
    },
    ...
); 

Есть ли причина, почему это плохая практика?

Должен ли я вместо этого оставить _id, который будет установлен MongoDB, и использовать поле id для обновления существующих документов?

1 Ответ

0 голосов
/ 27 августа 2018

Помимо того, что _id является неизменным , вы можете использовать все, что пожелаете, полосу массива.

Это даже может быть в ваших интересах.С тщательно созданными индексами и запросами вы можете извлечь выгоду из пересечений индексов (в запросе используется более одного индекса) .Это само по себе дает вам больше возможностей для эффективного моделирования ваших данных, но давайте пока отложим этот аспект.Более интересным моментом является то, что если вам требуется только подмножество полей документов, которые покрыты индексами, вы можете сделать соответствующий запрос «покрытым» (отвечая только на индексы, которые обычно хранятся в оперативной памяти), используяиндекс, который вы не можете избежать.

tl; dr: ObjectId - это просто конструкция, позволяющая предоставить глобально уникальный идентификатор в случае, если ваши данные не предоставляют один .Использование чего-то, что содержит семантическое значение вместо ObjectId - это то, что я лично считаю лучшей практикой.

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