sql >> データベース >  >> NoSQL >> MongoDB

MongoDBのドキュメントにカスタム_idを使用することに利点はありますか?

    独自の_idを生成することの利点 s:

    • 1 の増分番号を割り当てることで、より人間に優しいものにすることができます。 、 2 3 、...

    • または、ランダムな文字列を使用して、より人間に優しいものにすることができます: t3oSKd9q

      (これは画面上のスペースをあまり占有せず、リストから選択でき、必要に応じて手動でコピーできる可能性があります。ただし、衝突を防ぐために十分な長さにする必要があります。)

    • ランダムに生成された文字列を使用する場合、同じ時間に作成されたレコードを同じシャードにグループ化する傾向がある標準のmongo ObjectIdとは異なり、シャーディングの分布はほぼ均等になります。 (それが役立つかどうかは、シャーディング戦略によって異なります。)

    • または、独自のカスタム _idを生成することもできます s関連するオブジェクトを1つのシャードにグループ化します。所有者、地理的地域、またはその組み合わせによる。 (繰り返しになりますが、それが望ましいかどうかは、データのクエリ方法や、データの生成と保存の速度によって異なります。 _id <ではなく、シャードキーを指定してこれを行うこともできます。 / code> 自体。以下の説明を参照してください。)

    ObjectIdを使用する利点 s:

    • ObjectIdは、衝突を回避するのに非常に優れています。独自の_idを生成する場合 ■ランダムにまたは同時に、衝突のリスクを自分で管理する必要があります。

    • ObjectIdには、作成時間が含まれています。これは、ドキュメントの作成日を保持し、ドキュメントを時系列で並べ替える安価で簡単な方法です。 (一方、ドキュメントの作成日を公開/リークしたくない場合は、そのObjectIdを公開しないでください!)

    nanoid モジュールは、短いランダムIDを生成するのに役立ちます。また、計算機 も提供します。 これは、1時間に生成するドキュメント/ IDの数に応じて、適切なIDの長さを選択するのに役立ちます。

    または、mongoose-generate-unique-key と書きました。 非常にを生成するため 短いランダムID(マングースライブラリを使用している場合)。

    シャーディング戦略

    データをシャーディングする最善の方法について専門家であるとは言いませんが、次のような状況が考えられます。

    1. 天文台または粒子加速器は、1秒あたりギガバイトのデータを処理します。興味深いイベントが検出された場合、彼らは大量のデータを保存したいと思うかもしれません。 ほんの数秒で。この場合、おそらくシャード全体にドキュメントを均等に分散させて、各シャードがデータを保存するために同じように一生懸命働き、誰のシャードも圧倒されないようにする必要があります。

    2. 膨大な量のデータがあり、すべてを処理する必要がある場合があります 一度に。この場合(ただし、アルゴリズムによっては)、均等な分散が再び望ましい場合があります。これにより、すべてのシャードが、最後に結果を結合する前に、データのチャンクの処理に等しく懸命に取り組むことができます。 (ただし、このシナリオでは、シャードキーではなく、MongoDBのバランサーを使用して均等に分散できる場合があります。バランサーは、データが保存された後、バックグラウンドで実行されます。大量のデータを収集した後、次のことを行う必要があります。チャンクを一晩再配布するためにそのままにしておきます。)

    3. 大量のデータを含むソーシャルメディアアプリがありますが、今回は多くの異なるユーザーが多くの簡単なクエリを実行しています 主に彼ら自身のデータ、または彼らの特定の友人やトピックに関連しています。この場合、ユーザーが小さなクエリを実行するたびにすべてのシャードを含めることは意味がありません。 1人のユーザーに属するすべてのドキュメントが1つのシャードに保存されるように、userId(またはトピックまたは地理的地域)でシャードすることは理にかなっています。そのユーザーがクエリを実行すると、1つのシャードだけが作業を行う必要があります。これにより、他のシャードが他のユーザーのクエリを自由に処理できるようになり、一度に多くのユーザーにサービスを提供できるようになります。

    4. 作成時までにドキュメントをシャーディングする (デフォルトのObjectIdsが提供する)同様の期間のデータを調べる軽いクエリがたくさんある場合は、これが望ましい場合があります。たとえば、さまざまなユーザーがさまざまな履歴チャートをクエリしています。

      ただし、ほとんどのユーザーが最新のドキュメントのみをクエリしている場合(ソーシャルメディアプラットフォームでの一般的な状況)は、1つまたは2つのシャードがほとんどの作業を取得することを意味するため、それほど望ましくない場合があります。トピックごと、またはおそらく地域ごとに配布すると、全体的な配布がよりフラットになる可能性がありますが、関連するドキュメントを1つのシャードにまとめることもできます。

    このテーマに関する公式ドキュメントを読むことをお勧めします:



    1. Pythonでjson.load中にキーを編集/名前変更するにはどうすればよいですか?

    2. Pythonを使用してMongoDBのbsondumpをJSONに変換するにはどうすればよいですか?

    3. モンゴエイジグループアグリゲーション

    4. MongoDBクエリの結果を内部配列サイズで並べ替えるにはどうすればよいですか?