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

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_CONCATSTRING_AGG(配列バージョン)に相当する役割を果たします。重複を除外したい場合は、代わりに $addToSet 演算子を使用するとよいでしょう。

  1. 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

  2. Python | 2番目のリストを基準に最初のリストの値を並べ替える方法

    Pythonでは、2番目のリストを基準として最初のリストの値を並べ替えたい場合、「sorted」メソッドと「zip」関数を組み合わせることで簡単に実現できます。リストは、整数・浮動小数点数・文字列など、さまざまなデータ型の値(異種の値)をひとつにまとめて格納できる便利なデータ構造です。sortedメソッド:リストの要素を昇順に並べ替えるために使用します。zip関数:複数のイテラブルを受け取り、対応する要素同士をタプルとして集約した結果を返します。以下に具体的な実装例を示します。サンプルコードdef list_sort(my_list_1, my_list_2):    zi