MongoDBで上位N行のデータを取得する方法|aggregateフレームワークの使い方
MongoDBで上位N行をクエリするには?
MongoDBでコレクションから上位N行(上位N件)のドキュメントを取得したい場合は、アグリゲーションフレームワーク(aggregate)を使うのが基本です。$sortステージで並べ替えを行い、$limitステージで取得件数を制限することで、目的のデータを効率的に抽出できます。
この記事では、サンプルコレクションの作成から上位N行の取得までの手順を、サンプルコード付きでわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、学生名(StudentName)とスコア(Score)を含むドキュメントを「topNRowsDemo」コレクションに挿入していきます。
> db.topNRowsDemo.insertOne({"StudentName":"Larry","Score":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca26eee6304881c5ce84b91")
}
> db.topNRowsDemo.insertOne({"StudentName":"Chris","Score":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca26ef66304881c5ce84b92")
}
> db.topNRowsDemo.insertOne({"StudentName":"Mike","Score":65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca26efe6304881c5ce84b93")
}
> db.topNRowsDemo.insertOne({"StudentName":"Adam","Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca26f066304881c5ce84b94")
}
> db.topNRowsDemo.insertOne({"StudentName":"John","Score":86});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca26f0f6304881c5ce84b95")
}2. 登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。pretty()を組み合わせると、インデントされた読みやすい形式で出力されます。
> db.topNRowsDemo.find().pretty();
実行すると、以下のように5件のドキュメントが表示されます。
{
"_id" : ObjectId("5ca26eee6304881c5ce84b91"),
"StudentName" : "Larry",
"Score" : 78
}
{
"_id" : ObjectId("5ca26ef66304881c5ce84b92"),
"StudentName" : "Chris",
"Score" : 45
}
{
"_id" : ObjectId("5ca26efe6304881c5ce84b93"),
"StudentName" : "Mike",
"Score" : 65
}
{
"_id" : ObjectId("5ca26f066304881c5ce84b94"),
"StudentName" : "Adam",
"Score" : 55
}
{
"_id" : ObjectId("5ca26f0f6304881c5ce84b95"),
"StudentName" : "John",
"Score" : 86
}3. 上位N行を取得するクエリの実行
それでは、アグリゲーションパイプラインを使って上位N行を取得してみましょう。以下の例では、$sortでStudentNameを昇順に並べ替え、$limitで先頭5件に絞り込み、さらに$matchでScoreが65より大きいドキュメントだけを抽出しています。
> db.topNRowsDemo.aggregate([
... {$sort: {StudentName: 1}},
... {$limit: 5},
... {$match: {Score: {$gt: 65}}}
... ]).pretty();このクエリを実行すると、条件を満たす次の2件のドキュメントが出力されます。
{
"_id" : ObjectId("5ca26f0f6304881c5ce84b95"),
"StudentName" : "John",
"Score" : 86
}
{
"_id" : ObjectId("5ca26eee6304881c5ce84b91"),
"StudentName" : "Larry",
"Score" : 78
}パイプラインステージの解説
- $sort:指定したフィールドを基準にドキュメントを並べ替えます。「1」は昇順、「-1」は降順を意味します。
- $limit:パイプラインを通過できるドキュメントの件数を指定した数に制限します。
- $match:条件に一致するドキュメントのみをフィルタリングします。SQLのWHERE句に相当する役割です。
まとめ
MongoDBで上位N行を取得するには、aggregate()メソッドのパイプラインに$sortと$limitを組み合わせるのが基本です。条件による絞り込みが必要な場合は$matchを追加しましょう。ただし、$matchを$sortや$limitの前後に置くかで結果が変わるため、意図した処理順序になるようステージの配置に注意してください。
-
MongoDBのサブドキュメントを検索する方法:ドット表記を使ったクエリ実行手順を解説
MongoDBでは、ネストされたサブドキュメント(埋め込みドキュメント)を検索する際に、ドット表記(dot notation)を使用します。フィールド名とサブフィールド名をドット(.)でつなぐことで、階層構造を持つデータにも簡単にアクセスできます。この記事では、実際にコレクションを作成し、サブドキュメントに対してクエリを実行するまでの手順をサンプルコード付きで解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って、サブドキュメントを含むドキュメントをコレクションに挿入します。> db.demo537.insertOne({details:{S
-
MongoDBでSQLのLIKE検索と同じことを実現する方法
MongoDBにおけるLIKE検索の基本SQLの「LIKE」句のように部分一致でデータを検索したい場合、MongoDBでは find() メソッドと正規表現(//)を組み合わせることで同様の処理を実現できます。この記事では、実際にコレクションを作成し、正規表現を使ったLIKE検索の具体的な手順を解説します。テスト用コレクションの作成まず、サンプルとなるドキュメントを含むコレクションを作成しましょう。ここでは「FirstName」というフィールドを持つドキュメントをいくつか登録します。> db.demo686.insertOne({FirstName:Robert});{ &nb