結果を並べ替える
Overview
読み取り操作でドキュメントが返される順序を変更するには、sort
を使用します。Sort
は、返されたドキュメントを 1 つ以上のフィールドの値で特定の方向に並べ替えるように MongoDB に指示します。返されたドキュメントをフィールド別に昇順(一番小さいものが先頭)でソートするには、値に 1
を使用します。降順(一番大きいものが先頭)で並べ替えるには、-1
を使用します。ソートを指定しない場合、MongoDB はクエリ結果の順序を保証しません。
サンプル ドキュメント
以下の例にある指示に従って、データを 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 }, ]);
注意
クエリ操作により、一致するドキュメントを含むカーソルへの参照が返される場合があります。 カーソルに保存されているデータを調べる方法については、「 カーソルの基礎ページ 」を参照してください。
例
以下のソート・ドキュメントを読み取り操作に渡すと、操作によって、長さの長い書籍が長さの短い書籍の前に返されるようになります。
// define an empty query document const query = {}; // sort in descending (-1) order by length const sort = { length: -1 }; const cursor = myColl.find(query).sort(sort); 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」の両方とも 1104
ページあるため、返される順序は保証されません。並べ替えられた結果の同点を再現可能な方法で解決するには、並べ替えドキュメントにフィールドを追加します。
// define an empty query document const query = {}; // sort in ascending (1) order by length const sort = { length: 1, author: 1 }; const cursor = myColl.find(query).sort(sort); for await (const doc of cursor) { console.dir(doc); }
ソート ドキュメントにauthor
フィールドを追加すると、読み取り操作は一致するドキュメントを最初にlength
でソートし、その後、同点の場合はauthor
によってソートします。 一致したドキュメント フィールドは、ソート ドキュメントで指定されたフィールドと同じ順序で比較されます。 クエリに一致するドキュメントでこの並べ替えを使用すると、 find()
はドキュメントの次の順序付けを返します。同じ長さの 2 冊の書籍を"Wallace"
の前に並べ替えると、 "Martin"
が並べ替えられます。
{ "_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 }