cursor.skip()
項目一覧
定義
cursor.skip(<offset>)
重要
mongosh メソッド
このページでは、
mongosh
メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
MongoDB が結果を返し始める場所を制御するには、カーソルで
skip()
メソッドを呼び出します。この方法を活用して、結果をページ分割して表示できます。注意
データベースからドキュメントを取得する前に、カーソルに
skip()
を適用する必要があります。skip()
メソッドには次のパラメーターがあります。Parameterタイプ説明offset
数値結果セットでスキップするドキュメントの数。
動作
と の使用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); }