返される結果の数を制限する
Overview
このガイドでは、MongoDB Kotlin ドライバーを使用して読み取り操作から返される結果の数を制限する方法を学習できます。
読み取り操作によって返されるドキュメント数を制限するには、 limit()
を使用します。 このインスタンス メソッドは、読み取り操作によって返されるドキュメントの最大数を指定します。 指定した制限に達する数のドキュメントがない場合は、より小さな数値が返されます。 skip()
インスタンス メソッドでlimit()
を使用すると、最初にスキップが適用され、制限はスキップ後に残ったドキュメントにのみ適用されます。 skip()
メソッドの詳細については、返されたドキュメントのスキップに関するガイドを参照してください。
次の例は、それぞれ、コレクションにデータを挿入する方法、 limit()
を使用して返されるドキュメント数を制限する方法、 limit()
とskip()
を組み合わせてクエリから返される結果をさらに絞り込む方法を示しています。
サンプル ドキュメント
次のセクションでは、このサンプル ドキュメントを更新する例を紹介します。
{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 } { "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 }
このデータは、次の Kotlin データ クラスでモデル化されます。
data class Book( val id: Int, val title: String, val author: String, val length: Int )
制限を指定する
次の例では、コレクションをクエリして、最も長い上位 3 冊の本を返します。 最初にクエリですべてのドキュメントを照合し、次にlength
フィールドで並べ替えて、長さの長い書籍を長さの短い書籍の前に返します。 最後に、戻り値を3
ドキュメントに制限し、次の 3 つのドキュメントを長さ順にソートして返します。
val results = collection.find() .sort(descending("length")) .limit(3) results.collect { println(it) }
Book(id=2, title=Les Misérables, author=Hugo, length=1462) Book(id=6, title=A Dance with Dragons, author=Martin, length=1104) Book(id=4, title=Infinite Jest, author=Wallace, length=1104)
Tip
find コマンドは常に最初にソートし、その後に制限を適用するため、 limit()
とsort()
を呼び出す順序は関係ありません。 次の 2 つの呼び出しは同等です。
collection.find().sort(descending("length")).limit(3) collection.find().limit(3).sort(descending("length"))
スキップと制限の組み合わせ
次の 3 冊の最も長い書籍を表示するには、 find()
呼び出しにskip()
メソッドを追加します。 skip()
に渡される整数引数によって、検索操作で返されるドキュメントの数が決まります。 この操作では、4 冊目から 6 冊目までの最も長い書籍について説明するドキュメントが返されます。
val results = collection.find() .sort(descending("length")) .skip(3) .limit(3) results.collect { println(it) }
Book(id=3, title=Atlas Shrugged, author=Rand, length=1088) Book(id=5, title=Cryptonomicon, author=Stephenson, length=918) Book(id=1, title=The Brothers Karamazov, author=Dostoyevsky, length=824)
この方法でskip()
とlimit()
を組み合わせてコレクションのページングを実装すると、コレクションの小さなサブセットのみが一度に返されます。
注意
複数のクエリ間で安定したソートを実現するには、一意のキー( _id
など)を使用してソートする必要があります。 それ以外の場合、 skip()
とlimit()
の呼び出しとsort()
の組み合わせでは、予期しない結果が生じる可能性があります。
たとえば、次のデータについて考えてみます。
{ type: "computer", data: "1", serial_no: 235235 } { type: "computer", data: "2", serial_no: 235237 } { type: "computer", data: "3", serial_no: 235239 } { type: "computer", data: "4", serial_no: 235241 }
type
のみでソートした場合、 sort()
は戻り時に同じ順序を保証しません。 sort()
にskip()
とlimit()
を追加すると、異なるクエリに対して異なるドキュメントが返される可能性があります。 この場合、 data
またはserial_no
で並べ替えると、両方とも一意のキーであるため、安定した並べ替えが保証されます。
このガイドで言及されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。