3

制限付きでmongoをクエリし、スキップ/制限を使用して次のページをクエリした場合にさらに結果が得られるかどうかを知るための好ましい方法はありますか?

私がやっていることは、必要以上に1つ多くのドキュメントを要求し、それを最後からスライスし、その余分なドキュメントの存在を使用して、別のクエリで少なくとももう1つの結果が得られるかどうかを知ることです。

n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]

これは一般的な使用例(Webサイトに[その他の結果]ボタンを表示するかどうかを知る)であり、現在のソリューションには愚かだと感じています。

4

1 に答える 1

5

MongoDBには調整可能なカーソルがあり、すべてのデータが返された後にカーソルを再利用できます。次のようになります。

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()

取得されるドキュメントは10個だけですが、カーソルを調べて、使用可能なオブジェクトが他にあるかどうかを判断できることに注意してください。唯一の問題は、調整可能なカーソルは上限付きコレクションでのみ使用できることです。

上記は通常のカーソルでも使用できますが、n + 1ドキュメントをクエリする必要があります。これは基本的に、現在使用しているものと同じソリューションです。size()ただし、スキップと制限の修飾子が考慮されるため、使用する必要があります。

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n

私はPyMongoに精通していないので、これは確かにはわかりませんが、このソリューションn + 1が必要なドキュメントではなく完全なドキュメントをアプリケーションに送信しn、帯域幅のオーバーヘッドがわずかになる可能性があります。その場合は、同じことを行うサーバー側関数を作成することをお勧めしますがn、配列内のドキュメントを含むオブジェクトと、ドキュメントが使用可能かどうかを示すフラグn + 1のみを返します。

于 2010-08-19T09:16:59.127 に答える