2013-08-18 1 views
2

Я разрабатываю приложение, создающее постоянные ссылки. Я не уверен, как сохранить документы в MondoDB. Две стратегии:Генерация _id vs. ObjectId автогенерации в MongoDB

  1. ObjectId автогенерацию

    MongoDB autogenerates _id. Мне нужно создать индекс в поле permalink, потому что я получаю информацию по постоянной ссылке. Также я могу получить доступ к времени создания ObjectId, используя метод getTimestamp(), поэтому поля datetime кажутся избыточными, но если я удалю это поле, мне нужно два вызова MongoDB, чтобы взять информацию, а другую - временную метку.

    { 
        "_id": ObjectId("5210a64f846cb004b5000001"), 
        "permalink": "ca8W7mc0ZUx43bxTuSGN", 
        "data": "a lot of stuff", 
        "datetime": ISODate("2013-08-18T11:47:43.460+-100") 
    } 
    
  2. Сформировать _id

    Я генерировать _id с Permalink.

    { 
        "_id": "ca8W7mc0ZUx43bxTuSGN", 
        "data": "a lot of stuff", 
        "datetime": ISODate("2013-08-18T11:47:43.460+-100") 
    } 
    

Я не вижу каких-либо преимуществ использования ObjectIds. Я что-то упускаю?

+0

Я не вижу реального вопроса? autogenerated _id имеет некоторую приятную информацию, как временную метку, поэтому вам не нужно будет хранить дату и время в отдельном поле, как в настоящее время. И, кстати, _id генерируется автоматически, он гарантирует уникальность – Dukeatcoding

ответ

6

ObjectId s существует в ситуациях, когда у вас нет уникального ключа для каждого документа в коллекции. Они уникальны, поэтому вам не нужно беспокоиться о конфликтах, и они достаточно хорошо очерчены в крупных развертываниях, не слишком беспокоясь (они имеют за и против, читают больше here).

ObjectId также содержит временную метку клиента, где был создан ObjectId (если только сервер БД не настроен на создание всех ключей). При этом, как вы заметили, вы можете использовать метку времени для выполнения некоторых операций с датой. Однако, если вы планируете использовать структуру агрегации, вы обнаружите, что не можете использовать ObjectId в любых действиях на дату в настоящий момент (issue). Если вы хотите использовать автофокус, вам понадобится второе поле, которое содержит дату, к сожалению, вдвое сохраняя его с внутренним значением ObjectId.

Если вы можете быть уверены, что созданный вами _id уникален, то нет причин для использования ObjectId в вашей структуре данных.