5


1

mongodbを使用してWebアプリを構築している開発者の場合、長いプライマリキーについてはどうしますか?

RDBMSのIDは通常、0から任意の数までの単純な整数ですが、通常は5桁の範囲に保持して、次のようなURLを作成できます

myawesomeblog.com/posts/23456

しかし、mongodbでは、各レコードの一意の識別子は次のようになります。 47cc67093475061e3d95369d

それに基づいたアプリとビルドは、このようなURLにつながるmyawesomeblog.com/posts/47cc67093475061e3d95369d

好きじゃない? とにかくmongoに整数ベースのID番号を短くして一意にする方法はありますか? (MySQLなど)

3 Answer


1


以下は、DOCSから増分値を作成するためのリンクです。

http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22


1


私が試した1つの方法(そしてうまくいくようです)は、次のようなドキュメントでSequencesコレクションを作成することです:

\ {名前:「投稿」、値:12345、_id:ObjectId( "47cc67093475061e3d95369d")}

Postsコレクションに挿入する前に、「Posts」という名前の現在のシーケンスを取得し、その値をインクリメントします。 次に、その値を新しい投稿文書のURLフレンドリーIDまたはObjectIdとして使用します。

このアプローチは、OracleのSELECT seq.NEXTVAL FROM DUALを主キーとして使用するようなものです。

完全ではありませんが、コレクション内のすべてのドキュメントを取得し、IDの最大値を見つける必要がなくなります。


1


レプリケーションの使用を開始すると、増分キーを作成するものはすべて機能しません。 私は、gitのようなユニークなSHAプレフィックスを生成するものを使用しています。 整数キーは提供されませんが、簡単に変更できます。 また、一意であることは保証されていませんが、増分キーを使用する場合よりも衝突の可能性がはるかに低くなります。 私のモデルには次のものがあります:

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」のように見えることを意味します。