2012-04-30 20 views
2

をソートし、私は次のことを達成しようとして問題が生じています:MongoDBの無限スクロールが結果

私は「無限」のスクロール機能や特定の属性によってソートされるすべての結果をフェッチしてページを持っているしたいと思います。コードが現在動作する方法は、クエリを配置し、結果をソートして表示します。問題は、ユーザーがページの一番下に到達して新しいクエリーが配置されると、このクエリーの結果はソートされますが、それ自体のコンテキストでソートされることです。つまり、合計100件の結果があり、最初のクエリで50件しか表示されない場合は、ソートされます。しかし、次のクエリ(次の50)は、100(合計結果)ではなく、これらの50の結果に基づいてのみ結果をソートします。

したがって、すべての結果を一度にフェッチして並べ替える必要がありますか、またはページ分割のロジックを適用する必要がありますか、MongoDBが実際に無限スクロール(AJAXリクエスト)を行い結果にソートを適用する方法がありますか?

答えて

1

私はMongoDBの経験がないと言っていますが(これはNoSQLデータベースであることを認識していますが)

しかし、この質問は多かれ少なかれ一般的なデータベースの1つです。私は、同じ原則が適用されますが、Cassandra(別の、全く別のNoSQLデータベース)を使用してそのような機能を実装しました。

最後に取得したレコードのsorted-by属性を使用して、データベース内の範囲検索を実行します。だから、あなたのデータベースと仮定すると、文字の次のセットで構成されています

A 
B 
C 
D 
E 
F 
G 

..and一度に2つの文字を取得して、あなたが最初にA, Bを取得すると思います。より多くのレコードが必要な場合は、Bを使用して、データベース内の文字セットの範囲検索を実行します。平易な英語では、これはのようになります。

MongoDBのチュートリアルを簡単に見から2

に結果を制限し、B後に表示される文字を取得し、あなたがへconditional operatorsを持っているように、それが見えますこれを実装するのに役立ちます。

2

MongoDBでこれを行うには、いくつかの方法があります。 .skip().limit()コマンド(ここに記載されています:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-CursorMethods)を使用して、ページネーションをクエリに適用できます。

また、{sorted_field : {$gt : <value from last record>}}のようにクエリに句を追加することもできます。つまり、ソートされた値が現在の結果ページの最後の結果アイテムのクエリ値よりも小さいクエリの一致を除外します。たとえば、結果のページ1がドキュメントAからDを返す場合、次のページ2を取得するために、追加のフィルタx > Dを使用して同じクエリを繰り返します。