MongoDBの集計フレームワークで$skipと$limitを使い、重複を排除した順序付きレコードを表示する方法
MongoDBで重複を排除しながら順序付きのレコードを取得したい場合には、集計フレームワーク(Aggregation Framework)を活用するのが最も効果的です。$sort(並べ替え)、$skip(読み飛ばし)、$limit(取得件数の制限)を組み合わせることで、distinctな値を持つレコードに対してページネーションのような柔軟な処理を実現できます。
サンプルコレクションの作成
まずは動作確認用として、「orderedDistinctDemo」という名前のコレクションにドキュメントを挿入していきましょう。
> db.orderedDistinctDemo.insertOne({"Name":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8e0140b992277dae0e9")
}
> db.orderedDistinctDemo.insertOne({"Name":"Larry"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8e5140b992277dae0ea")
}
> db.orderedDistinctDemo.insertOne({"Name":"Larry"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8e7140b992277dae0eb")
}
> db.orderedDistinctDemo.insertOne({"Name":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8ea140b992277dae0ec")
}
> db.orderedDistinctDemo.insertOne({"Name":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8ee140b992277dae0ed")
}
> db.orderedDistinctDemo.insertOne({"Name":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8f2140b992277dae0ee")
}
> db.orderedDistinctDemo.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8f6140b992277dae0ef")
}
> db.orderedDistinctDemo.insertOne({"Name":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccfb8f9140b992277dae0f0")
}これで「John」「Larry」「Carol」などに重複を含む8件のドキュメントが登録されました。
登録済みドキュメントの確認
find()メソッドを使えば、コレクション内のすべてのドキュメントを表示できます。
> db.orderedDistinctDemo.find().pretty();
実行結果は以下の通りです。
{ "_id" : ObjectId("5ccfb8e0140b992277dae0e9"), "Name" : "John" }
{ "_id" : ObjectId("5ccfb8e5140b992277dae0ea"), "Name" : "Larry" }
{ "_id" : ObjectId("5ccfb8e7140b992277dae0eb"), "Name" : "Larry" }
{ "_id" : ObjectId("5ccfb8ea140b992277dae0ec"), "Name" : "Sam" }
{ "_id" : ObjectId("5ccfb8ee140b992277dae0ed"), "Name" : "John" }
{ "_id" : ObjectId("5ccfb8f2140b992277dae0ee"), "Name" : "Carol" }
{ "_id" : ObjectId("5ccfb8f6140b992277dae0ef"), "Name" : "David" }
{ "_id" : ObjectId("5ccfb8f9140b992277dae0f0"), "Name" : "Carol" }$group・$sort・$skip・$limitを組み合わせたクエリ
それでは本題です。次のクエリでは、$groupでNameフィールドの重複を排除し、$sortで昇順に並べ替えた上で、$skipによる読み飛ばしと$limitによる件数制限を適用しています。
> db.orderedDistinctDemo.aggregate(
... { $group : { _id : "$Name" }},
... { $sort : { _id: 1 }},
... { $skip : 3 },
... { $limit : 8 }
... );各ステージの役割は以下の通りです。
- $group:「_id : "$Name"」と指定することで、Nameフィールドの値ごとにグループ化し、重複を排除します。
- $sort:グループ化された_id(=Nameの値)を昇順(1)に並べ替えます。
- $skip:並べ替え後の先頭3件を読み飛ばします。
- $limit:取得する最大件数を8件に制限します。
このクエリを実行すると、次の出力が得られます。
{ "_id" : "Larry" }
{ "_id" : "Sam" }出力結果の解説
重複を排除して昇順に並べ替えると、「Carol」「David」「John」「Larry」「Sam」の5件になります。ここから先頭3件(Carol、David、John)が$skipによって読み飛ばされ、残りの「Larry」と「Sam」だけが表示されるという仕組みです。
このように$groupでdistinctな値を作り出し、$sort+$skip+$limitを後段に連結すれば、重複のないデータセットに対しても柔軟なページング処理が実現できます。大量のデータから特定範囲の結果だけを効率的に取り出したい場合に、ぜひ活用してみてください。
-
MongoDBで一意のレコードのみを表示し、重複データを除外する方法
MongoDBのdistinct()メソッドで重複を除外するMongoDBで一意(ユニーク)なレコードのみを表示したい場合は、distinct()メソッドを使用します。このメソッドは、指定したフィールドの重複しない値だけを配列として返してくれます。ここでは、実際にサンプルコレクションを作成しながら、その使い方を確認していきましょう。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、意図的に重複した名前を含むドキュメントをいくつか挿入します。> db.demo613.insertOne({Name:Chris});{ acknowledged : tru
-
MySQLで日付型カラムから今日と明日のレコードを抽出して表示する方法
MySQLでは、日付型(DATE)のカラムに対して「今日」と「明日」の日付に該当するレコードだけを簡単に抽出できます。本記事では、サンプルテーブルを作成し、CURDATE() 関数と INTERVAL を組み合わせたクエリを使って、今日および明日の日付データを表示する手順を解説します。 1. サンプルテーブルの作成 まず、日付を格納するテーブルを作成します。 mysql> create table DemoTable ( AdmissionDate date ); Query OK, 0 rows affected (0.87 sec) AdmissionDate という DAT