MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法
点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。
1. サンプルコレクションの作成
まずは insertOne() メソッドを使って、4件のドキュメントを登録します。
> db.demo709.insertOne({Name:"John","Marks":75});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea839005d33e20ed1097b76")
}
> db.demo709.insertOne({Name:"Chris","Marks":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea839075d33e20ed1097b77")
}
> db.demo709.insertOne({Name:"David","Marks":54});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea839125d33e20ed1097b78")
}
> db.demo709.insertOne({Name:"Bob","Marks":69});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea839295d33e20ed1097b79")
}2. 登録されたドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo709.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ea839005d33e20ed1097b76"), "Name" : "John", "Marks" : 75 }
{ "_id" : ObjectId("5ea839075d33e20ed1097b77"), "Name" : "Chris", "Marks" : 45 }
{ "_id" : ObjectId("5ea839125d33e20ed1097b78"), "Name" : "David", "Marks" : 54 }
{ "_id" : ObjectId("5ea839295d33e20ed1097b79"), "Name" : "Bob", "Marks" : 69 }3. 点数が最も少ない2件を取得する集計クエリ
以下のクエリでは、3つのパイプラインステージを組み合わせています。まず $group で点数ごとに名前をグループ化し、次に $sort で点数を昇順(1)に並べ替え、最後に $limit で先頭の2件のみを取得します。
> db.demo709.aggregate({
... $group: {
... _id: '$Marks',
... ListOfName: { $push: '$Name' }
... }
... }, {
... $sort: {
... '_id': 1
... }
... }, {
... $limit: 2
... });実行結果は以下のとおりです。
{ "_id" : 45, "ListOfName" : [ "Chris" ] }
{ "_id" : 54, "ListOfName" : [ "David" ] }出力を見ると、点数が最も少ない「Chris(45点)」と「David(54点)」の2件が正しく取得できていることがわかります。
$group ステージで $push を使用して名前を配列にまとめているため、同じ点数のドキュメントが複数存在する場合でも、該当するすべての名前が ListOfName フィールドに格納され、データの取りこぼしが起こりません。このように $group → $sort → $limit の順にパイプラインを構成することで、最小値を持つドキュメントを柔軟かつ確実に抽出できます。
-
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法 MongoDBで複数の条件の「すべて」に一致するドキュメントを抽出したい場合には、Aggregationパイプラインの$matchステージと$and演算子を組み合わせます。本記事では、ネストされたドキュメント構造を持つコレクションを例に、実際のコードを通して具体的な手順を解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、ネストした構造を持つドキュメントを1件挿入し、テスト用のコレクションを作成します。 > db.demo574.insertOne( .
-
【MongoDB】aggregate()と$groupで異なるドキュメント内の同じIDを持つ要素を集約する方法
複数のドキュメントにまたがって同じIDを持つ要素をグループ化したい場合には、MongoDBの aggregate() メソッドと $group ステージを組み合わせるのが効果的です。本記事では、実際にサンプルコレクションを作成しながら、IDごとにドキュメントを集約する手順をわかりやすく解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入していきます。ここでは「id」と「Name」というフィールドを持つドキュメントを6件登録します。> db.demo602.insertOne({id:1,Name:"Chris"});{