MongoDBでネストされたドキュメントを集約する方法
MongoDBでネストされたドキュメントを集約するには
MongoDBで集約(アグリゲーション)処理を行うには、aggregate()メソッドを使用します。ネストされた(入れ子構造の)ドキュメントでも、ドット記法でフィールドパスを指定することで、深い階層にある値を集計することが可能です。
まずは、ネストされたドキュメントを含むコレクションを作成しましょう。
> db.demo199.insertOne(
... {
... "details1":{
... "details2":{
... "details3":{
... "Name":"Chris",
... "details4":{
... "details5":{
... "v1":10,
... "v2":20,
... "v3":30
... }
... }
... }}}}
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c24aa03d395bdc21346e2")
}
>
> db.demo199.insertOne(
... {
... "details1":{
... "details2":{
... "details3":{
... "Name":"Chris",
... "details4":{
... "details5":{
... "v1":30,
... "v2":40,
... "v3":50
... }
... }
... }}}}
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c24ab03d395bdc21346e3")
}次に、find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo199.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3c24aa03d395bdc21346e2"), "details1" : { "details2" : { "details3" : { "Name" : "Chris", "details4" : { "details5" : { "v1" : 10, "v2" : 20, "v3" : 30 } } } } } }
{ "_id" : ObjectId("5e3c24ab03d395bdc21346e3"), "details1" : { "details2" : { "details3" : { "Name" : "Chris", "details4" : { "details5" : { "v1" : 30, "v2" : 40, "v3" : 50 } } } } } }ネストされたドキュメントに対する集約クエリ
続いて、ネストされたドキュメントを対象とするMongoDBの集約クエリを紹介します。パイプラインでは$unwindでフィールドを展開し、$groupでグループ化しながら、$sum演算子を使って各階層の値を合計しています。
> var out = [
... {
... "$unwind": "$details1.details2"
... },
... {
... "$group": {
... "_id": "$details1.details2._id",
... "v1": { "$sum": "$details1.details2.details3.details4.details5.v1" },
... "v2": { "$sum": "$details1.details2.details3.details4.details5.v2" },
... "v3": { "$sum": "$details1.details2.details3.details4.details5.v3" },
... }
... }
...]
> result = db.demo199.aggregate(out);このクエリを実行すると、次の結果が得られます。
{ "_id" : null, "v1" : 40, "v2" : 60, "v3" : 80 }出力結果を見ると、2つのドキュメントに格納されていた値が正しく合計されていることがわかります。具体的には、v1は10+30で40、v2は20+40で60、v3は30+50で80となっています。このように、ドット記法でネストされたフィールドへのパスを指定すれば、どれほど深い階層にある値でもaggregate()で柔軟に集計できます。
-
MongoDBでネストされた配列にフィルタリング条件を設定する方法($filterと$condの使い方)
MongoDBでネストされた配列にフィルタリング条件を設定するにはMongoDBのaggregate()内で$filterと$condを使用すると、配列に対して柔軟なフィルタリング条件を設定できます。$filterは、指定した条件に基づいて配列の部分集合(条件を満たす要素のみ)を返却する演算子です。さらに、内部で$mapや$anyElementTrue、$indexOfBytesなどを組み合わせることで、ネストされた配列の中から特定の値を持つ要素だけを抽出できます。この記事では、「Messages」というネストされた配列の中から、特定の文字列(Hello)を含むドキュメントだけを絞り込む方法を
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO