9

大規模な MongoDB コレクションでの範囲ベースのページネーションのベスト プラクティスには精通していますが、ソート値が一意ではないフィールドにあるコレクションをページネーションする方法を理解するのに苦労しています。

たとえば、私は多数のユーザーのコレクションを持っており、ユーザーが何かを行った回数のフィールドがあります。このフィールドは明らかに一意ではなく、同じ値を持つドキュメントの大規模なグループを持つことができます。

その「numTimesDoneSomething」フィールドでソートされた結果を返したいと思います。

サンプル データ セットを次に示します。

{_id: ObjectId("50c480d81ff137e805000003"), numTimesDoneSomething: 12}
{_id: ObjectId("50c480d81ff137e805000005"), numTimesDoneSomething: 9}
{_id: ObjectId("50c480d81ff137e805000006"), numTimesDoneSomething: 7}
{_id: ObjectId("50c480d81ff137e805000007"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000002"), numTimesDoneSomething: 15}
{_id: ObjectId("50c480d81ff137e805000008"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000009"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000004"), numTimesDoneSomething: 12}
{_id: ObjectId("50c480d81ff137e805000010"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000011"), numTimesDoneSomething: 1}

ページごとに 2 つのレコードを持つ「numTimesDoneSomething」で並べ替えられたこのデータ セットを返すにはどうすればよいですか?

4

2 に答える 2

6

@cubbuk はoffset( skip) を使用した良い例を示していますが、彼が示したクエリをさまざまなページ付けのために成形することもできます。

db.collection.find().sort({numTimesDoneSomething:-1, _id:1})

_idhere は一意であり、あなたはそれを支持しているので、実際に範囲を広げることができ、結果は_id、 を持つ2つのレコード間であっても、それらが1つのページにあるべきか次のページにあるべきかについて一貫している必要があります.numTimesDoneSomething12

だから、次のような簡単なことをする

var q = db.collection.find({_id: {$gt: last_id}}).sort({numTimesDoneSomething:-1, _id:1}).limit(2)

範囲の広いページネーションには非常にうまく機能するはずです。

于 2013-01-10T08:30:21.817 に答える
2

numTimesDoneSomethingこの場合、複数のフィールドで並べ替えることができますid。id_ フィールドは挿入タイムスタンプに従ってすでに昇順であるため、反復中に新しいデータが挿入されない限り、重複データを反復せずにコレクションをページ分割できます。

db.collection.find().sort({numTimesDoneSomething:-1, _id:1}).offset(index).limit(2)
于 2013-01-10T07:45:51.400 に答える