Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

cursor.skip()

項目一覧

  • 定義
  • 動作
  • ページネーションの例
cursor.skip(<offset>)

重要

mongosh メソッド

このページでは、 mongosh メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません

MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。

MongoDB が結果を返し始める場所を制御するには、カーソルで skip() メソッドを呼び出します。この方法を活用して、結果をページ分割して表示できます。

注意

データベースからドキュメントを取得する前に、カーソルにskip()を適用する必要があります。

skip()メソッドには次のパラメーターがあります。

Parameter
タイプ
説明
offset
数値
結果セットでスキップするドキュメントの数。

skip()sort() とともに使用する場合、結果を skip() に渡す前に、ユニークな値を含むフィールドを少なくとも 1 つ並べ替えに含めるようにしてください。

重複する値を含むフィールドをソートすると、特にコレクションが書込み (write) をアクティブに受信している場合、複数回実行時に重複フィールドに対して異なるソート順序が返されることがあります。

並べ替えの整合性を保証する最も簡単な方法は、並べ替えクエリに_idフィールドを含めることです。

詳細については、sort() メソッドによるコンシステントソートを参照してください。

skip()limit() を連鎖する場合、メソッド連鎖の順序は結果に影響しません。サーバーは、ドキュメントを返す数に制限を適用する前に、常にソート順のスキップ操作を適用します。

このコード例は、skip()limit() の連鎖の順序が異なっても、同じデータセットに対しては常に同じクエリ結果が得られることを示しています。

db.myColl.find().sort({_id: 1}).skip(3).limit(6);
db.myColl.find().sort({_id: 1}).limit(6).skip(3);

次の 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 などの、時間の経過とともに一貫して変化し、重複した値を防ぐためにユニークインデックスを持つフィールドを選択する。

  • $ltおよびsort()演算子を使用して、フィールドが開始値より小さいドキュメントをクエリする。

  • 次のクエリのために最後に表示されたフィールド値を保存する。

たとえば、次の関数は上記の手順を使用して、コレクションから学生の名前のページを印刷します。ページは、_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);
}

注意

ObjectId の値は時間の経過とともに増加するはずですが、必ずしも単調ではありません。その理由は以下のとおりです。

  • 時間分解能は1秒のみなので、同じ秒内に作成された ObjectId 値の順序は保証されないため、および

  • クライアントによって生成され、システムクロックが異なる可能性があります。

ページ分割された結果を昇順で返す方法は前と同じですが、$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);
}

戻る

cursor.size