MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで最初の5件のレコードをスキップし、最後の5件だけを表示するクエリ

MongoDBでレコード(ドキュメント)をスキップするにはskip()メソッドを使用し、表示する件数を限定したい場合にはlimit()メソッドと組み合わせます。この2つを組み合わせることで、「最初の5件を読み飛ばして、残りの5件だけを取得する」といった処理が簡単に実現できます。ページネーション(ページ送り)の実装でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。

サンプルコレクションの作成

まずは、ドキュメントを格納したコレクションを作成します。ここでは「demo275」というコレクションに10件のドキュメントを挿入します。

> db.demo275.insertOne({"Number":10});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eac4dd099650a5401a43")
}
> db.demo275.insertOne({"Number":12});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eac7dd099650a5401a44")
}
> db.demo275.insertOne({"Number":6});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eac9dd099650a5401a45")
}
> db.demo275.insertOne({"Number":1});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eacadd099650a5401a46")
}
> db.demo275.insertOne({"Number":5});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eacddd099650a5401a47")
}
> db.demo275.insertOne({"Number":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48ead0dd099650a5401a48")
}
> db.demo275.insertOne({"Number":8});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48ead6dd099650a5401a49")
}
> db.demo275.insertOne({"Number":9});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48ead8dd099650a5401a4a")
}
> db.demo275.insertOne({"Number":19});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eadddd099650a5401a4b")
}
> db.demo275.insertOne({"Number":29});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48eae1dd099650a5401a4c")
}

find()メソッドですべてのドキュメントを表示する

作成したコレクション内のすべてのドキュメントは、find()メソッドを使って表示できます。

> db.demo275.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e48eac4dd099650a5401a43"), "Number" : 10 }
{ "_id" : ObjectId("5e48eac7dd099650a5401a44"), "Number" : 12 }
{ "_id" : ObjectId("5e48eac9dd099650a5401a45"), "Number" : 6 }
{ "_id" : ObjectId("5e48eacadd099650a5401a46"), "Number" : 1 }
{ "_id" : ObjectId("5e48eacddd099650a5401a47"), "Number" : 5 }
{ "_id" : ObjectId("5e48ead0dd099650a5401a48"), "Number" : 24 }
{ "_id" : ObjectId("5e48ead6dd099650a5401a49"), "Number" : 8 }
{ "_id" : ObjectId("5e48ead8dd099650a5401a4a"), "Number" : 9 }
{ "_id" : ObjectId("5e48eadddd099650a5401a4b"), "Number" : 19 }
{ "_id" : ObjectId("5e48eae1dd099650a5401a4c"), "Number" : 29 }

このように、全部で10件のドキュメントが登録されていることが確認できます。

最初の5件をスキップして最後の5件だけを表示するクエリ

それでは本題のクエリです。skip(5)で先頭の5件を読み飛ばし、limit(5)で最大取得件数を5件に制限することで、6件目以降の5件だけを表示できます。

> db.demo275.find().skip(5).limit(5)

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e48ead0dd099650a5401a48"), "Number" : 24 }
{ "_id" : ObjectId("5e48ead6dd099650a5401a49"), "Number" : 8 }
{ "_id" : ObjectId("5e48ead8dd099650a5401a4a"), "Number" : 9 }
{ "_id" : ObjectId("5e48eadddd099650a5401a4b"), "Number" : 19 }
{ "_id" : ObjectId("5e48eae1dd099650a5401a4c"), "Number" : 29 }

先頭の5件(Number:10、12、6、1、5)がスキップされ、残りの5件だけが取得できていることがわかります。

skip()とlimit()のポイントまとめ

skip(n):クエリ結果の先頭からn件をスキップします。
limit(n):取得するドキュメントの最大件数をn件に制限します。
両者を組み合わせれば、「1ページ5件表示の2ページ目」のように、任意の位置からデータを取得するページネーション処理もシンプルに実装できます。大量のデータを扱うWebアプリケーションでは必須のテクニックといえるでしょう。

  1. MySQLで日付データから月の初日と末日を取得する方法

    MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>

  2. Pythonで数値の最初と最後のビットだけがセットされているかを判定する方法

    問題の概要ある数値 n が与えられたとき、その2進表現において「最初(最上位)」と「最後(最下位)」の位置にのみビットがセットされている(1になっている)かどうかを判定します。例えば、入力が n = 17 の場合、2進表現は 10001 となり、最初と最後の位置にだけ 1 が存在するため、結果は True になります。解決のアプローチこの問題は、以下の手順で効率的に解くことができます。n が 1 と等しい場合は True を返します(2進表現が「1」のみで、最初と最後の位置が一致しているため)。それ以外の場合は、「n - 1 が 2 のべき乗であるか」を判定します。2のべき乗であれば True