リクエストからObjectIdを解析することは難しくありません(したがって、なぜそれが問題になるのかわかりません)。入力可能なURLを作成することが目標である場合は、短くて「わかりやすい」URLを使用することをお勧めします。
シャーディングされたMongoDBセットアップで一意であることが保証されている12バイトの数値を取得し、それを12バイト未満に凝縮して、一意であることが保証することはできません(たとえば、7文字で言及しました)。
docs から 、MongoDBObjectIdは次のもので構成されます。
- 4バイトのタイムスタンプ
- 3バイトのマシン識別子
- 2バイトのプロセスID
- および3バイトのカウンター。
したがって、ObjectIdの一部を犠牲にする(したがってシャーディングする)か、インデックス付きの代替ID作成形式を考案する必要があります。
IDをハッシュする可能性はありますが、ここでも、コーディングしたい競合が発生する可能性があります(ここでも、12バイトを4バイトに減らして一意性を保証することはできません)。また、競合が発生する可能性がある場合(使用可能なビットの総数を減らすと競合が発生する可能性があります)、とにかく何らかのセカンダリテーブルが必要になります(生成されたIDからObjectIdに移動するためのインデックスを作成する必要があります) 。
結果のオプション:
- 通常は重要なビットを削除します-これを行う場合は、しないでください コレクションをシャードする
- 独自の一意のIDソリューションを考案します(Webファーム内にある場合は、一意性を処理するためにMongoDBと非常によく似たものになる可能性があります)
- ObjectIdを長い数値として使用し、短縮アルゴリズムを実行します(JavaScriptの53ビットの数値精度を超えるため、最初に小さなチャンクに分割する必要があります)。たとえば、このアルゴリズムを試してください=エンコード それ(最終的には約17文字になります)
- 他の短いものを使用しますが、ドキュメントのIDとして一意です
- 最も簡単:IDが長いことを受け入れるだけです。 :)
(ブラウザがこの変換を行う必要がある理由は明確ではありません。なぜドキュメントのObjectIDを持っているのでしょうか?)