Что вы делаете с длинными первичными ключами для разработчиков, которые используют mongodb для создания своих веб-приложений? - PullRequest
5 голосов
/ 20 июля 2010

Идентификаторы в СУБД, как правило, представляют собой простые целые числа, которые идут от 0 до любого числа, но обычно вы можете хранить их в 5-значном диапазоне, чтобы вы могли создавать URL, которые выглядят следующим образом

myawesomeblog.com /posts / 23456

, но с mongodb уникальные идентификаторы для каждой записи выглядят так.47cc67093475061e3d95369d

, а создание и приложение на его основе приведет к таким URL-адресам, как этотЕсть ли способ заставить монго давать вам целочисленные идентификаторы, которые короче и уникальнее?(как MySQL)

Ответы [ 3 ]

1 голос
/ 23 июля 2010

Один из способов, которым я пытался (и, похоже, работает), - создать коллекцию последовательностей с такими документами:

{Имя: «Сообщения», Значение: 12345, _id: ObjectId («47cc67093475061e3d95369d»)}

Перед вставкой в ​​коллекцию сообщений вы должны взять текущую последовательность с именем "Posts" и увеличить ее значение. Затем используйте это значение в качестве идентификатора, удобного для URL, или ObjectId для вашего нового документа Post.

Этот подход похож на использование Oracle SELECT seq.NEXTVAL FROM DUAL в качестве первичных ключей.

Не идеально, но при этом не нужно захватывать все документы в коллекции и находить максимальное значение некоторого идентификатора.

1 голос
/ 26 июля 2010

Все, что создает инкрементный ключ, не будет работать, как только вы начнете использовать репликацию. Я использую что-то для генерации уникального префикса SHA, как это делает git. Он не дает вам целочисленный ключ, но его можно легко изменить. Также не гарантируется, что он будет уникальным, но у вас есть намного меньше шансов на столкновение, чем при увеличении ключа. В моей модели есть следующие вещи:

before_create :set_short_id

def set_short_id
  prefix_length = 5
  sha = Digest::SHA1.hexdigest(self.to_json)
  short_id = nil
  while short_id.nil? || Ticket.first(:short_id => short_id)
    short_id = sha.first(prefix_length)
    prefix_length += 1
  end
  self.short_id = short_id
end

def to_param
  short_id
end

Это означает, что мои URL выглядят как myawesomeblog.com/posts/47cc6, что немного лучше.

1 голос
/ 20 июля 2010

Вот ссылка для создания инкрементного значения из DOCS

http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...