MongoDBでネストされたオブジェクトに対してグループクエリを実行する方法
MongoDBでは、ネストされたオブジェクト(サブドキュメント)のフィールドを基準にデータをグループ化したい場合があります。そのようなときは、ドット表記(dot notation)と$groupステージを組み合わせることで、簡単に集計クエリを実行できます。
この記事では、実際にコレクションを作成し、ネストされたフィールドに対してグループ集計を行う手順を順番に解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、clientDetailsというネストされたオブジェクトを持つドキュメントを複数件挿入します。
> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "Chris",
... "Age":32,
... "Project":"Online Library Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b86c954c74be91e69b")
}
>
> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "David",
... "Age":34,
... "Project":"Online Hospital Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b86c954c74be91e69c")
}
>
> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "David",
... "Age":34,
... "Project":"Online Library Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b96c954c74be91e69d")
}2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo617.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e99d2b86c954c74be91e69b"), "clientDetails" : { "Name" : "Chris", "Age" : 32, "Project" : "Online Library Management System" } }
{ "_id" : ObjectId("5e99d2b86c954c74be91e69c"), "clientDetails" : { "Name" : "David", "Age" : 34, "Project" : "Online Hospital Management System" } }
{ "_id" : ObjectId("5e99d2b96c954c74be91e69d"), "clientDetails" : { "Name" : "David", "Age" : 34, "Project" : "Online Library Management System" } }3. ネストされたオブジェクトに対するグループクエリ
ここが本題です。aggregate()メソッド内で$groupステージを使用し、_idにドット表記で "$clientDetails.Project" を指定します。さらに$sumを使って各プロジェクトのドキュメント数をカウントしています。
> db.demo617.aggregate({ $group : {_id : "$clientDetails.Project", All : { $sum : 1 }} });実行結果は以下の通りです。
{ "_id" : "Online Hosiptal Management System", "All" : 1 }
{ "_id" : "Online Library Management System", "All" : 2 }ポイントのまとめ
- ネストされたフィールドを参照するには、
親フィールド.子フィールドの形式でドット表記を使用します。 $groupの_idにドット表記のパスを指定することで、サブドキュメント内の値ごとにグループ化できます。{ $sum : 1 }は、グループ内のドキュメント数をカウントする定番の書き方です。
このように、ドット表記と$groupを組み合わせれば、ネストされたオブジェクトのフィールドでも通常のフィールドと同じ感覚で集計処理を行えます。売上データやユーザー情報など、階層構造を持つドキュメントの統計分析にぜひ活用してください。
-
MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...