Docs Menu
Docs Home
/ / /
Java 同期
/ / /

返される結果の数を制限する

項目一覧

  • 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ドキュメントを参照してください。

  • FindIterable

  • MongoIterable

  • MongoCursor

  • find()

戻る

返された結果をスキップする