Overview
このガイドでは、次のメソッドを使用して、読み取り操作から返されるドキュメントを指定する方法を学習できます。
sort(): 返されるドキュメントのソート順序を指定します。limit(): クエリから返されるドキュメントの最大数を指定します。skip(): クエリ結果を返す前にスキップするドキュメントの数を指定します。
サンプルデータの例
このガイドの例を実行するには、次のコード スニペットを使用して、書籍について説明するドキュメントを myDB.booksコレクションに挿入します。
const myDB = client.db("myDB"); const myColl = myDB.collection("books"); await myColl.insertMany([ { "_id": 1, "name": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }, { "_id": 2, "name": "Les Misérables", "author": "Hugo", "length": 1462 }, { "_id": 3, "name": "Atlas Shrugged", "author": "Rand", "length": 1088 }, { "_id": 4, "name": "Infinite Jest", "author": "Wallace", "length": 1104 }, { "_id": 5, "name": "Cryptonomicon", "author": "Stephenson", "length": 918 }, { "_id": 6, "name": "A Dance With Dragons", "author": "Martin", "length": 1104 }, ]);
注意
カーソルを反復処理する前に、sort()、limit()、skip()、project() などのカーソル メソッドを読み取り操作に連結する必要があります。カーソルを反復処理した後にカーソル メソッドを指定した場合、 設定は読み取り操作には適用されません。
注意
クエリ操作、一致するドキュメントを含むカーソルへの参照が返される場合があります。カーソルに保存されているデータを調べる方法については、「カーソルからデータにアクセスする」ページを参照してください。
Sort
読み取り操作でドキュメントが返される順序を変更するには、 sort() メソッドを使用します。このメソッドは、返されたドキュメントを 1 つ以上のフィールドの値で特定の方向に並べ替えるようにMongoDBに指示します。返されたドキュメントをフィールド別に昇順(一番小さいものが先頭)でソートするには、1 の値を使用します。降順(一番大きいものが先頭)で並べ替えるには、-1 を使用します。ソートを指定しない場合、 MongoDB はクエリ結果の順序を保証しません。
次の例では、ソート・ドキュメントを読み取り操作に渡して、操作によって、長さの長い書籍が長さの短い書籍の前に返されるようになります。
// define an empty query document const query = {}; // sort in descending (-1) order by length const sortFields = { length: -1 }; const cursor = myColl.find(query).sort(sortFields); for await (const doc of cursor) { console.dir(doc); }
この場合、-1 という数値は、書籍を長さの降順でソートするように読み取り操作に指示しています。この並べ替えを空のクエリで使用すると、find() は次のドキュメントを返します。
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
場合によっては、指定された並べ替えを使用すると、2 つ以上のドキュメントの順序があいまいになることがあります。前の例では、"A Dance with Dragons" と "Infinite Jest" の title 値を持つドキュメントの両方に length が 1104 であるため、返される順序は保証されません。並べ替えられた結果の同点を再現可能な方法で解決するには、 並べ替えドキュメントにフィールドを追加します 。
// define an empty query document const query = {}; // sort in ascending (1) order by length const sortFields = { length: 1, author: 1 }; const cursor = myColl.find(query).sort(sortFields); for await (const doc of cursor) { console.dir(doc); }
ソートドキュメントに authorフィールドを追加すると、読み取り操作は一致するドキュメントを最初に length でソートし、同点の場合は author でソートします。一致したドキュメントフィールドは、 ソートドキュメントで指定されたフィールドと同じ順序で比較されます。この並べ替えをクエリに一致するドキュメントで使用すると、find() はドキュメントの次の順序付けを返します。
{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 }
Limit
読み取り操作から返されるドキュメントの数を制限するには、 limit() メソッドを使用します。このメソッドは、操作によって返されるドキュメントの最大数を指定しますが、制限に達する数のドキュメントが存在しない場合は、操作返されるドキュメントの数が少なくなることがあります。limit() を skip() メソッドで使用すると、最初に skip が適用され、制限は skip 後に残ったドキュメントにのみ適用されます。
この例では、次のアクションを実行します。
空のクエリフィルターを使用して、コレクション内のすべてのドキュメントを一致させます
sort()メソッドを呼び出して、lengthフィールドで結果に降順の並べ替えを適用します最初の
3結果のみを返すには、limit()メソッドを呼び出します
// define an empty query document const query = {}; // sort in descending (-1) order by length const sortFields = { length: -1 }; const limitNum = 3; const cursor = myColl.find(query).sort(sortFields).limit(limitNum); for await (const doc of cursor) { console.dir(doc); }
上記のコードの例では、長さ順に並べられた次の 3 つのドキュメントが出力されます。
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 6, "title": "A Dance With Dragons", "author": "Martin", "length": 1104 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 }
注意
ドライバーは呼び出しの順序を並び替え、最初にソートするため、limit() と sort() を呼び出す順序は関係ありません。次の 2 つの呼び出しは同等です。
myColl.find(query).sort({ length: -1 }).limit(3); myColl.find(query).limit(3).sort({ length: -1 });
スキップ
Use the skip() method to omit documents from the beginning of the read operation results. You can combine skip() with sort() to omit the top (for descending order) or bottom (for ascending order) results for a given query. Since the order of documents returned is not guaranteed in the absence of a sort, using skip() without using sort() omits arbitrary documents.
skip()の値がクエリに一致するドキュメントの数を超える場合、そのクエリはドキュメントを返しません。
この例では、次のアクションを実行して、コレクションに対して 5 番目と 6 番目の書籍をコレクションします。
空のクエリフィルターを使用して、コレクション内のすべてのドキュメントを一致させます
sort()メソッドを呼び出してlengthフィールドに降順の並べ替えを適用します。これにより、短いブックの前に長いブックが返されます最初の 4 つの一致するドキュメントを結果から除外するには、
skip()メソッドを呼び出します。
// define an empty query document const query = {}; const sortFields = { length: -1 }; const skipNum = 4; const cursor = myColl.find(query).sort(sortFields).skip(skipNum); for await (const doc of cursor) { console.dir(doc); }
クエリは一致する最初の 4 つのドキュメントをスキップするため、上記のコード スニペットは 5 番目と 6 番目の最も長いドキュメントを出力します。
{ "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
制限、ソート、スキップの組み合わせ
1 回の操作で limit、sort、skip オプションを組み合わせることができます。 これにより、返されるソートされたドキュメントの最大数を設定して、返される前に指定された数のドキュメントをスキップできます。
次の例では、length の値が "1104" であるドキュメントを返します。結果はアルファベット順にソートされ、最初のドキュメントをスキップし、最初の結果のみが含まれます。
const query = {length: "1104"}; const cursor = myColl.find(query).sort({ title: 1 }).skip(1).limit(1); for await (const doc of cursor) { console.dir(doc); }
注意
これらのメソッドを呼び出す順序によって、返されるドキュメントは変更されません。
詳細情報
クエリの指定の詳細については、クエリ操作を参照してください。
ドキュメント検索の詳細については、ドキュメントの検索を参照してください。
API ドキュメント
このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。