返される結果の数を制限する
Overview
このガイドでは、MongoDB Java ドライバーを使用して読み取り操作から返される結果の数を制限する方法を学習します。
読み取り操作によって返されるドキュメント数を制限するには、 limit()
を使用します。 このインスタンス メソッドは、読み取り操作によって返されるドキュメントの最大数を指定します。 指定した制限に達する数のドキュメントがない場合は、より小さな数値が返されます。 skip()
インスタンス メソッドでlimit()
を使用すると、最初にスキップが適用され、制限はスキップ後に残ったドキュメントにのみ適用されます。 skip()
メソッドの詳細については、返されたドキュメントのスキップに関するガイドを参照してください。
次の例は、それぞれ、コレクションにデータを挿入する方法、 limit()
を使用して返されるドキュメント数を制限する方法、 limit()
とskip()
を組み合わせてクエリから返される結果をさらに絞り込む方法を示しています。
サンプル ドキュメント
次の操作では、書籍を表すドキュメントをコレクションに挿入します。
collection.insertMany(Arrays.asList( new Document().append("_id", 1) .append("title", "The Brothers Karamazov").append("length", 824) .append("author", "Dostoyevsky"), new Document().append("_id", 2) .append("title", "Les Misérables").append("length", 1462).append("author", "Hugo"), new Document().append("_id", 3) .append("title", "Atlas Shrugged").append("length", 1088).append("author", "Rand"), new Document().append("_id", 4) .append("title", "Infinite Jest").append("length", 1104).append("author", "Wallace"), new Document().append("_id", 5) .append("title", "Cryptonomicon").append("length", 918).append("author", "Stephenson"), new Document().append("_id", 6) .append("title", "A Dance with Dragons").append("length", 1104) .append("author", "Martin") ));
制限を指定する
次の例では、コレクションをクエリして、最も長い上位 3 冊の本を返します。 最初にクエリですべてのドキュメントを照合し、次にlength
フィールドで並べ替えて、長さの長い書籍を長さの短い書籍の前に返します。 最後に、戻り値を3
ドキュメントに制限します。
import com.mongodb.client.*; import org.bson.Document; import static com.mongodb.client.model.Sorts.descending; // ... // define a cursor that will return the first 3 sorted items MongoCursor<Document> cursor = collection.find() .sort(descending("length")) .limit(3) .iterator(); // print out items try { while (cursor.hasNext()) { System.out.println(cursor.next()); } } // close the cursor finally { cursor.close(); }
上記のコード例では、次の 3 つのドキュメントが長さ順にソートされて出力されます。
Document{{_id=2, title=Les Misérables, author=Hugo, length=1462}} Document{{_id=6, title=A Dance with Dragons, author=Martin, length=1104}} Document{{_id=4, title=Infinite Jest, author=Wallace, length=1104}}
Tip
ドライバーは最初にソートし、その後に制限を適用して、呼び出しの順序を並び替えるため、limit()
と sort()
を呼び出す順序は関係ありません。次の 2 つの呼び出しは同等です。
collection.find().sort(descending("length")).limit(3); collection.find().limit(3).sort(descending("length"));
スキップと制限の組み合わせ
次の 3 冊の最も長い書籍を表示するには、次のコード例に示すように、 skip()
メソッドをfind()
呼び出しに追加します。
MongoCursor<Document> cursor = collection.find() .sort(descending("length")) .limit(3) .skip(3) .iterator();
この操作では、4 冊目から 6 冊目までの最も長い書籍について説明するドキュメントが返されます。
Document{{_id=3, title=Atlas Shrugged, author=Rand, length=1088}} Document{{_id=5, title=Cryptonomicon, author=Stephenson, length=918}} Document{{_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ドキュメントを参照してください。