2

mongodb ID を短縮して、URL で使用する構文を解析しやすくするにはどうすればよいですか。現在の反復では文字列が長すぎます。

Base64 はまともですが、それでも長すぎます。サブ 7 文字の範囲でさらに探しています。

node.js とブラウザの両方でエンコード/デコードできるようにしたいと考えています。

4

2 に答える 2

3

リクエストから ObjectId を解析することは難しくありません (なぜそれが問題なのかわかりません)。目標が入力可能な URL を作成することである場合は、短くて「使いやすい」URL を持つことが重要です。

シャードされたMongoDBセットアップで一意であることが保証されている12バイトの数値を取得して、それを12バイト未満に圧縮し、一意であることを保証することはできません(たとえば、7文字で言及しました)。

docsから、MongoDB ObjectId は次のもので構成されます。

  • 4 バイトのタイムスタンプ
  • 3 バイトのマシン ID
  • 2 バイトのプロセス ID
  • および 3 バイトのカウンター。

そのため、ObjectId の一部を犠牲にする (したがってシャーディングする) か、インデックス付きの別の Id 作成形式を考案する必要があります。

ID を潜在的にハッシュすることはできますが、コーディングしたい競合が発生する可能性があります (繰り返しますが、12 バイトを 4 バイトに減らして一意性を保証することはできません)。競合が発生する可能性がある場合 (使用可能なビットの総数を減らすと競合が発生する可能性があります)、何らかのセカンダリ テーブルが必要になります (また、生成された ID から ObjectId に移動するためのインデックスを作成する必要があります)。 .

結果のオプション:

  • 通常は重要なビットを削除します -- これを行う場合、コレクションを分割しないでください
  • 独自の一意の ID ソリューションを考案します (Web ファーム内にある場合は、一意性を処理するために MongoDB と非常によく似たものになる可能性があります)。
  • ObjectId を長い数値として使用し、短縮アルゴリズムを実行します (JavaScript の数値精度 53 ビットを超えるため、最初に小さなチャンクに分割する必要があります)。たとえば、このアルゴリズムを試してください =エンコードします (最終的には17文字)
  • ドキュメントのIDとして、より短いが一意のものを使用します
  • 最も簡単: ID が長いことを受け入れるだけです。:)

(ブラウザがこの変換を行う必要がある理由は明らかではありません。なぜドキュメントの ObjectID を持っているのでしょうか?)

于 2013-01-13T20:31:16.510 に答える