2017-11-30 13 views
0

現在、MongoDBでWebアプリケーションを作成しており、ブラウザにコンテンツのページを取り込みます。MongoDB - 遠隔クエリによるページング

私は(ここに見られる:https://scalegrid.io/blog/fast-paging-with-mongodb/を):ページングの二つの方法を認識してい

1)

2).find({_id > last_id}).limit(n)

私は最初のソリューションとパフォーマンスの問題を理解し、そのので、オプションが画像の外にあった。

結果が大きい場合は、結果が_idでソートされている場合にのみ、2番目の解決策が効果的です。日付などの固有ではないフィールドでソートすると、その日付のドキュメントが複数存在することがあります。そのため、一部のドキュメントが結果から除外される可能性があります。

さらに、常に更新する必要があり、前のページの最後のドキュメントの_idによって決定される変数がlast_idであるため、ユーザーはページを直線的に移動する必要があります。ユーザーが1ページ目から7ページ目にジャンプした場合、ページ2の結果がページ2に表示されます。

これは私の質問です。一意でないフィールド(DateやfirstNameなど)でソートしていた場合はページングを行い、ユーザーが複数のページを一度にジャンプできるようにするにはどうすればよいですか?

どのようなヒントもありがとうございます、ありがとうございます!

+0

あなたは、負荷のどのような種類を実行していますか? DBに数百万と数百万のレコードが含まれていない限り、パフォーマンスの問題に気づくことはありません。以上のことを複雑にしないでください。単に 'find()。skip()。limit()'を使ってください。最初に動作させてから、実際に必要なときに最適化してください。 – VtoCorleone

答えて

1

コメントは間違いありません。たくさんのドキュメントがあるとわからない限り、スキップしても問題ありません。しかし、多くのことを期待していなくても大成功を収めたとしても、何百万人ものユーザーがコードを壊さないようにすることは望ましくありません。

あなた日付でソートして、idで次の操作を行うことができます場合:

.find(
    { 
    date:{ 
     $lte:lastDate 
    }, 
    _id:{ 
     $lt: lastId 
    } 
    } 
).limit(n) 
+0

返信いただきありがとうございます!これは、 '_id'以外のものでソートできないという問題を解決します。しかし、私はまだ複数のページをスキップする可能性の問題が残っています。つまり、ページ1のユーザーはページ7にまっすぐに進みます。その場合、 'lastDate'と' lastId'の値は適切ではないでしょうか? 2ページ目、7ページ目ではありませんか? – calviners

+0

@calvinersページングは​​このようにはできませんが、これはfacebookの無限スクロールのようなものです。とにかく何百ものページを提供すれば、ページングは​​ちょっとばかげています。何百ものページを提供する代わりに、より良い検索オプションを提供するかもしれません。私は多くのGoogleを使用し、ほとんど2ページに行く必要はありません。 – HMR

関連する問題