2017-01-11 2 views
1

私はこれを全部探してきました。私はCouchDB 2.0を実行しており、従来のビューや新しいMangoクエリを使用して一連のデータを取得する際に、選択肢があることを理解しています。CouchDB 2.0でマンゴークエリにstartkeyページネーションが必要です

私は現在、マンゴークエリの構文を使用して、必要な結果を得ていますが、今はページネーションを実装する必要があります。 CouchDBの2.0でのページネーションを研究するとき、私は、トピックの周りにこの優れた議論が見つかりました:

http://docs.couchdb.org/en/2.0.0/couchapp/views/pagination.html

それは、大規模なデータセットをページ分割するための最良の方法は、スキップを使用する代わりに、startkeyを使用して実行するはないことを示唆していますあるページから次のページへのリンクリストページングの種類。

だからこれは私には理にかなっているし、自分のアプリケーションのために動作しますが、私はその後、マンゴー/ _find APIに電源を入れたときに、私はstartkeyに合格する方法を参照することはできません。

http://docs.couchdb.org/en/2.0.0/api/database/find.html

間違えやすいが十分スキップパラメータを受け入れますが、スタートキーはありません。

ここで何が起こっているのか説明できる人はいますか? Mango/_findのパフォーマンス特性は、大きなデータセットでスキップを安全に使用できるように大きく異なっていますか?または、より大きなデータのコレクションをトラバースするときに、スタートキーのビューを使用する必要がありますか?

この特定の質問は、最新のAFAIKのドキュメントで回答されていないようです。どんな助けでも大歓迎です。

答えて

0

あなたはおそらくセレクタで制約を含むことにより、サポートstartkey/endkeyの不足を回避することができます:

"selector": { 
    "_id": { "$gte": "myStartKey", "$lte": "myEndKey"} 
} 

(ちょうど私の2セント、多分他の誰かが、より完全な答えを持っている)

0

CageDBで文書化されたページネーション手法は、map-reduce/viewsの種類のクエリにのみ適用され、Mangoクエリには適用できません。主にビューでは、ソートに使用するキーフィールドが1つしかないので、 'startkey'を使用して以前のドキュメントをスキップしやすくなり、startkey_docidを追加することによって一意でないキーの場合は簡単になります。

セレクタクエリの場合、以前のレコードを効果的にスキップするには、元のクエリで指定されたソートキーを参照し、すでに処理されているドキュメントをスキップする条件を追加する必要があります。たとえば、数値フィールドでソートして値= 10まで処理した場合、元のセレクタ内に{"field":{"$ gte":10}}を$とロジックとして追加できます。ソートフィールドが複数ある場合は、これが複雑になります。スキップ/リミットは、セレクタクエリのページネーションの方が簡単です。

関連する問題