MongoDBで配列内のドキュメントを集約する方法|$min・$maxを使った集計手順を解説
MongoDBでは、配列形式で保存されたドキュメント(サブドキュメント)の値を集計したいケースがよくあります。そのような場合に活躍するのがアグリゲーションフレームワーク(Aggregation Framework)です。本記事では、実際のコード例をもとに、配列内のフィールドから最小値・最大値を抽出する方法を段階的に解説します。
1. サンプルコレクションの作成
まずは、ユーザー情報を配列として持つドキュメントを含むコレクションを作成します。ドキュメントの挿入には insertOne() メソッドを使用します。
> db.aggregateArrayDemo.insertOne(
{
"_id":100,
"UserDetails": [
{
"UserName": "John",
"UserLoginYear":2010
},
{
"UserName": "Carol",
"UserLoginYear":2019
}
]
}
);
{ "acknowledged" : true, "insertedId" : 100 }この例では、_id: 100 のドキュメントの中に、2人のユーザー情報(名前とログイン年)が配列 UserDetails として格納されています。
2. 登録したドキュメントの確認
作成したコレクションの内容を確認するには、find() メソッドを使用します。見やすい出力にするため pretty() を組み合わせています。
> db.aggregateArrayDemo.find().pretty();
実行すると、以下のような結果が表示されます。
{
"_id" : 100,
"UserDetails" : [
{
"UserName" : "John",
"UserLoginYear" : 2010
},
{
"UserName" : "Carol",
"UserLoginYear" : 2019
}
]
}3. アグリゲーションで配列ドキュメントを集約する
いよいよ本題です。配列内の UserLoginYear フィールドに対して最小値と最大値を求めるには、aggregate() メソッドを使います。パイプラインには以下の2つのステージを指定します。
- $match: 対象となるドキュメントを絞り込みます(ここでは
_id: 100を指定)。 - $project: 出力するフィールドを整形し、
$minと$max演算子で最小値・最大値を計算します。
> db.aggregateArrayDemo.aggregate([
{
$match: { _id: 100 }
},
{
$project: {
Minimum: { $min: "$UserDetails.UserLoginYear" },
Maximum: { $max: "$UserDetails.UserLoginYear" }
}
}
]);実行結果は以下の通りです。
{ "_id" : 100, "Minimum" : 2010, "Maximum" : 2019 }まとめ
このように、MongoDBのアグリゲーションフレームワークを使えば、配列内のネストされたドキュメントの値も簡単に集計できます。$match で対象を絞り込み、$project と $min/$max を組み合わせることで、配列フィールド全体を走査した最小値・最大値を1つのクエリで取得できます。同様の手法は $sum や $avg などの他の累積演算子にも応用できるので、ぜひ活用してみてください。
-
MongoDBで配列フィールドを使ってドキュメントをフィルタリングする方法($elemMatch演算子の使い方)
MongoDBで配列内の要素に基づいてドキュメントをフィルタリングしたい場合、$elemMatch 演算子を使用します。$elemMatch は、指定した条件を満たす要素を少なくとも1つ含む配列フィールドを持つドキュメントを照合するための演算子です。この記事では、実際にコレクションを作成し、$elemMatch を使って配列条件でドキュメントを絞り込む手順を解説します。サンプルコレクションの作成まず、テスト用のコレクションにドキュメントを挿入してみましょう。ここでは、学生の名前と点数(Marks)を持つ details 配列を含むドキュメントを作成します。> db.demo453.ins
-
MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説
MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic