7

クエリに基づいてmongoからオブジェクトのリストを取得する必要があるユースケースがあります。ただし、パフォーマンスを向上させるために、ページネーションを追加しています。したがって、最初の呼び出しでは、たとえば 10 個のオブジェクトのリストを取得します。次の呼び出しでは、さらに 10 個必要です。しかし、ページに表示されている最初の 10 個のオブジェクトが変更 [削除] されている可能性があるため、offset と pageSize を直接使用することはできません。

解決策は、渡された最後のオブジェクトのオブジェクト ID を見つけ、その ObjectId の後に続く 10 個のオブジェクトを取得することです。

Morphia mongoを使って効率的に行う方法を教えてください。

4

2 に答える 2

7

morphia を使用すると、次のコマンドでこれを行うことができます。

datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");

最後に取得した ID の後にアイテムを取得するためにクエリを実行しているため、削除されたアイテムを処理する必要はありません。

于 2013-01-29T21:43:40.013 に答える
2

skip()私が思いついたことの 1 つは、インターフェイスの動作を変更するつもりがない限り、ここで使用する場合と同じ問題が発生するということです。

このように範囲指定されたクエリを使用すると、別の種類のインターフェイスを使用する必要があります。これは、特に従来のページングの問題を回避するためにこれを行う場合は、現在どのページにいて、将来何ページ存在するかを正確に検出するのが難しくなるためです。

このタイプのページングから生じるインターフェイスのデフォルトのタイプは、無限にスクロールするページにすぎません。YouTube のビデオ コメントや Facebook のウォール フィード、さらには Google+ を考えてみてください。物理的なページネーションや「ページ」はなく、代わりに「もっと見る」ボタンがあります。

これは、範囲指定ページングをより適切に機能させるために使用する必要があるタイプのインターフェースです。

クエリについては、@cubbuk が良い例を示しています。

datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");

greaterThan(lastId)last より上のすべてを見つけたいので、そうあるべきであることを除いて_id。レコードを挿入する前に OjbectIds を作成しない限り、並べ替えも_id行います。その場合は、代わりに挿入時に特定のタイムスタンプ セットを使用できます。

于 2013-01-30T08:12:39.637 に答える