41

MongoDB をストレージ バックエンドとして使用するサービスを作成しています。サービスはユーザー入力のハッシュを生成し、同じハッシュ (+ 入力) がデータセットに既に存在するかどうかを確認します。

ハッシュは一意ですがランダム(=非増分/順次)になるため、私の質問は次のとおりです。

  1. オブジェクト ID にランダムな値を使用することは合法ですか? 例:

$object_id = new MongoId(HEX-OF-96BIT-HASH);

それとも、「実際の」ObjectID にはタイムスタンプや machine_id なども含まれているため、MongoDB は ObjectID を他のサーバーで生成されたものとは異なる方法で処理しますか?

「ランダム」値を使用することの長所と短所は何ですか? 新しい _id がインクリメンタルでない場合、エンジンが挿入時にインデックスを更新するのは統計的に遅くなると思います-私はそれで正しいですか?

4

4 に答える 4

48

はい、オブジェクトIDにランダムな値を使用することはまったく問題あり_idません。格納されているドキュメントのフィールドに値が存在する場合、それはobjectIdとして扱われます。

フィールドは常にインデックスが付けられ、主キーであるため_id、オブジェクトごとに異なるobjectidが生成されることを確認する必要があります。ユーザー定義のオブジェクトIDを最適化するためのガイドラインがいくつかあります。

https://docs.mongodb.com/manual/core/document/#the-id-field

于 2012-08-31T08:09:27.190 に答える
7

インデックス作成のパフォーマンスに関する質問の1つに対する答えを見つけました。

_idがある程度明確に定義された順序である場合、挿入時に_idインデックスのbツリー全体をロードする必要はありません。BSONObjectIdsにはこのプロパティがあります。

ソース:http ://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

于 2012-09-02T17:42:45.543 に答える
7

それが良いか悪いかは、その独自性にかかっています。もちろん、MongoDB が提供する ObjectId は非常にユニークなので、これは良いことです。その独自性を再現できる限り、問題はありません。

独自の ID を使用することによる固有のリスク/パフォーマンスの低下はありません。文字列形式で使用すると、より多くのインデックス/ストレージ/クエリ機能が使用される可能性があると思いますが、MongoID (ObjectId) 形式で使用しているため、単純な文字列に保存しないことの利点が保持されます。

于 2012-08-31T08:12:04.877 に答える