MongoDBでステータス別にグループ化する方法:aggregate()の活用例
MongoDBでステータスごとにグループ化する方法
特定のステータス値を持つドキュメントを分類してグループ化したい場合、MongoDBではaggregate()メソッドを使用します。この記事では、$group、$cond、$setDifferenceなどの集計演算子を組み合わせて、ステータスの値に応じてドキュメントを振り分ける方法を、実際のコード例とともに解説します。
1. コレクションとドキュメントの作成
まず、サンプル用のコレクションを作成し、ドキュメントを挿入しましょう。
> db.demo149.insertOne({"Status":40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350386fdf09dd6d08539c4")
}
> db.demo149.insertOne({"Status":40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350388fdf09dd6d08539c5")
}
> db.demo149.insertOne({"Status":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e35038afdf09dd6d08539c6")
}
2. 挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo149.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e350386fdf09dd6d08539c4"), "Status" : 40 }
{ "_id" : ObjectId("5e350388fdf09dd6d08539c5"), "Status" : 40 }
{ "_id" : ObjectId("5e35038afdf09dd6d08539c6"), "Status" : 50 }
3. ステータス別にグループ化する集計クエリ
以下は、Statusフィールドの値に基づいてドキュメントを「done(完了)」と「notdone(未完了)」にグループ化するクエリです。
> db.demo149.aggregate([
... {
... "$group": {
... "_id": null,
... "done": {
... "$push": {
... "$cond": [
... { "$eq": [ "$Status", 40 ] },
... { "_id": "$_id", "Status": "$Status" },
... false
... ]
... }
... },
... "notdone": {
... "$push": {
... "$cond": [
... { "$eq": [ "$Status", 50 ] },
... { "_id": "$_id", "Status": "$Status" },
... false
... ]
... }
... }
... }
... },
... {
... "$project": {
... "_id": 0,
... "done": {
... "$setDifference": [ "$done", [false] ]
... },
... "notdone": {
... "$setDifference": [ "$notdone", [false] ]
... }
... }
... }
... ]);
このクエリのポイントは次の通りです。
- $group:
_idをnullに指定することで、コレクション全体を単一のグループとして扱います。 - $push と $cond:Statusが40であれば「done」配列に、50であれば「notdone」配列にドキュメントを追加します。条件に一致しない場合は
falseが挿入されます。 - $setDifference:後続の
$projectステージで配列からfalseを除外し、条件に一致したドキュメントだけを最終結果として残します。
4. 実行結果
上記のクエリを実行すると、次のような結果が出力されます。
{
"done" : [
{ "_id" : ObjectId("5e350386fdf09dd6d08539c4"), "Status" : 40 },
{ "_id" : ObjectId("5e350388fdf09dd6d08539c5"), "Status" : 40 } ], "notdone" : [
{ "_id" : ObjectId("5e35038afdf09dd6d08539c6"), "Status" : 50 }
]
}
このように、Statusが40の2件のドキュメントは「done」に、Statusが50の1件のドキュメントは「notdone」に正しく分類されていることが確認できます。$condによる条件分岐と$setDifferenceによる不要要素の除去を組み合わせることで、柔軟なグループ化処理が実現できます。タスク管理システムなどで完了・未完了のデータを一括集計したい場合に、この手法は非常に役立ちます。
-
MongoDBでネストされた配列にフィルタリング条件を設定する方法($filterと$condの使い方)
MongoDBでネストされた配列にフィルタリング条件を設定するにはMongoDBのaggregate()内で$filterと$condを使用すると、配列に対して柔軟なフィルタリング条件を設定できます。$filterは、指定した条件に基づいて配列の部分集合(条件を満たす要素のみ)を返却する演算子です。さらに、内部で$mapや$anyElementTrue、$indexOfBytesなどを組み合わせることで、ネストされた配列の中から特定の値を持つ要素だけを抽出できます。この記事では、「Messages」というネストされた配列の中から、特定の文字列(Hello)を含むドキュメントだけを絞り込む方法を
-
Microsoft Teamsでステータスメッセージを設定する方法【初心者向け解説】
Microsoft Teamsでステータスメッセージを設定すると、自分が今どこで何をしているのかを同僚に簡単に伝えられます。こまめにステータスを更新しておけば、「今どんな作業をしていますか?」といったやり取りを減らせるうえ、席を離れるときにひと工夫加えてユーモアを演出することもできます。 ステータスメッセージの設定手順 設定方法はとてもシンプルです。まず、Microsoft TeamsのWebクライアントまたはデスクトップアプリを開き、画面右上にある自分のプロフィール画像をクリックします。続いて、メニューから「ステータス メッセージの設定」を選択しましょう。 メッセージの入力と文字数制限