cursor.skip()
定義
cursor.skip(<offset>)
重要
mongosh メソッド
このページでは、
mongosh
メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
MongoDB が結果を返し始める場所を制御するには、カーソルで
skip()
メソッドを呼び出します。この方法を活用して、結果をページ分割して表示できます。注意
データベースからドキュメントを取得する前に、カーソルに
skip()
を適用する必要があります。skip()
メソッドには次のパラメーターがあります。Parameterタイプ説明offset
数値
結果セットでスキップするドキュメントの数。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
動作
skip()
を sort()
で使用する
skip()
をsort()
と併用する場合、結果をskip()
に渡す前に、一意の値を含むフィールドを少なくとも 1 つ並べ替えに含めるようにしてください。
重複する値を含むフィールドをソートすると、特にコレクションが書込み (write) をアクティブに受信している場合、複数回実行時に重複フィールドに対して異なるソート順序が返されることがあります。
並べ替えの整合性を保証する最も簡単な方法は、並べ替えクエリに_id
フィールドを含めることです。
詳細については、sort() メソッドによるコンシステントソートを参照してください。
skip()
を limit()
で使用する
skip()
と limit()
を連鎖する場合、メソッド連鎖の順序は結果に影響しません。サーバーは、ドキュメントを返す数に制限を適用する前に、常にソート順のスキップ操作を適用します。
このコード例は、skip()
と limit()
の連鎖の順序が異なっても、同じデータセットに対しては常に同じクエリ結果が得られることを示しています。
db.myColl.find().sort({_id: 1}).skip(3).limit(6); db.myColl.find().sort({_id: 1}).limit(6).skip(3);
ページネーションの例
使用 skip()
次の JavaScript 関数では、skip()
を使用して、コレクションを _id
フィールドごとにページ分割します。
function printStudents(pageNumber, nPerPage) { print( "Page: " + pageNumber ); db.students.find() .sort( { _id: 1 } ) .skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 ) .limit( nPerPage ) .forEach( student => { print( student.name ); } ); }
skip()
メソッドでは、サーバーに入力結果セットの先頭からスキャンを開始し、結果を返すよう要求します。オフセットが増加すると、skip()
は遅くなります。
範囲クエリの使用
範囲クエリでインデックスを使用して不要なドキュメントのスキャンを回避できます。通常、ページ分割に skip()
を使用する場合と比較して、オフセットが大きくなるにつれてパフォーマンスが向上します。
降順
範囲クエリを使用してページ区切りを実装するには、次の手順に従います。
_id
などの、時間の経過とともに一貫して変化し、重複した値を防ぐためにユニークインデックスを持つフィールドを選択する。次のクエリのために最後に表示されたフィールド値を保存する。
たとえば、次の関数は上記の手順を使用して、コレクションから学生の名前のページを印刷します。ページは、_id
フィールドを使用して、最新のドキュメントの順にソートされます(つまり、降順)。
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $lt: startValue } } ) .sort( { _id: -1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
次に、このページ区切り関数で、MaxKey
を使用して可能な限り最大のキーから開始することで、次のコードを使用してすべての学生の名前を印刷できます。
let currentKey = MaxKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }
昇順
ページ分割された結果を昇順で返す方法は前と同じですが、$gt
を昇順で使用します。
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $gt: startValue } } ) .sort( { _id: 1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
この関数の使い方も同様ですが、開始キーとして MinKey
を使用します。
let currentKey = MinKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }