MongoDBの$groupと$pushを使って値のリストを取得する方法
MongoDBの$groupと$pushで値のリストを取得する方法
MongoDBでフィールドの値をグループごとにリスト形式でまとめたい場合、集計フレームワーク(Aggregation Pipeline)の $group ステージと $push 演算子を組み合わせることで実現できます。
この記事では、実際にコレクションを作成し、ユーザーごとに科目(Subject)のリストを取得する手順を解説します。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。以下では insertOne() メソッドを使って5件のドキュメントを挿入しています。
> db.groupByDemo.insertOne({"UserName":"John","Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd69f0457806ebf1256f136")
}
> db.groupByDemo.insertOne({"UserName":"Larry","Subject":"MySQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd69f0657806ebf1256f137")
}
> db.groupByDemo.insertOne({"UserName":"John","Subject":"Java"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd69f0d57806ebf1256f138")
}
> db.groupByDemo.insertOne({"UserName":"John","Subject":"C"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd69f1357806ebf1256f139")
}
> db.groupByDemo.insertOne({"UserName":"Larry","Subject":"SQL Server"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd69f1c57806ebf1256f13a")
}このコレクションには、「John」と「Larry」の2人のユーザーが存在し、それぞれ複数の科目を持っています。
2. 登録されたドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.groupByDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cd69f0457806ebf1256f136"),
"UserName" : "John",
"Subject" : "MongoDB"
}
{
"_id" : ObjectId("5cd69f0657806ebf1256f137"),
"UserName" : "Larry",
"Subject" : "MySQL"
}
{
"_id" : ObjectId("5cd69f0d57806ebf1256f138"),
"UserName" : "John",
"Subject" : "Java"
}
{
"_id" : ObjectId("5cd69f1357806ebf1256f139"),
"UserName" : "John",
"Subject" : "C"
}
{
"_id" : ObjectId("5cd69f1c57806ebf1256f13a"),
"UserName" : "Larry",
"Subject" : "SQL Server"
}3. $groupと$pushで値のリストを取得する
ここからが本題です。$group ステージで _id にグループ化の基準となるフィールド(ここでは $UserName)を指定し、$push 演算子を使うことで、各グループに属する値を配列として収集できます。
> db.groupByDemo.aggregate({$group: { '_id': '$UserName', 'Subject': { $push: '$Subject'}}});実行結果は以下の通りです。
{ "_id" : "Larry", "Subject" : [ "MySQL", "SQL Server" ] }
{ "_id" : "John", "Subject" : [ "MongoDB", "Java", "C" ] }実行結果のポイント
- Larry の場合:「MySQL」「SQL Server」の2つの科目が配列としてまとめられています。
- John の場合:「MongoDB」「Java」「C」の3つの科目が配列としてまとめられています。
このように $push 演算子は、SQLにおける GROUP_CONCAT や STRING_AGG(配列バージョン)に相当する役割を果たします。重複を除外したい場合は、代わりに $addToSet 演算子を使用するとよいでしょう。
-
Pythonで別のリストの値を使ってリストをマスクする方法
あるリストの各要素が、別のリスト(検索対象リスト)に含まれているかどうかに応じて、元のリストを0と1だけで構成される「マスク」に変換したいケースはよくあります。このような処理には、Pythonのリスト内包表記を使うのが最もシンプルで読みやすい方法です。 サンプルコード 以下に具体的な実装例を示します。 my_list = [5, 6, 1, 9, 11, 0, 4] print(The list is :) print(my_list) search_list = [2, 10, 6, 3, 9] result = [1 if element in search_list else 0
-
Python | 2番目のリストを基準に最初のリストの値を並べ替える方法
Pythonでは、2番目のリストを基準として最初のリストの値を並べ替えたい場合、「sorted」メソッドと「zip」関数を組み合わせることで簡単に実現できます。リストは、整数・浮動小数点数・文字列など、さまざまなデータ型の値(異種の値)をひとつにまとめて格納できる便利なデータ構造です。sortedメソッド:リストの要素を昇順に並べ替えるために使用します。zip関数:複数のイテラブルを受け取り、対応する要素同士をタプルとして集約した結果を返します。以下に具体的な実装例を示します。サンプルコードdef list_sort(my_list_1, my_list_2): zi