MongoDBの集計フレームワークで特定のフィールド値に一致するドキュメントを取得する方法
MongoDBで特定のフィールド値に一致するドキュメントを抽出したい場合は、集計フレームワーク(Aggregation Framework)の $match ステージを使用します。この記事では、実際にコレクションを作成しながら、$match を使った条件一致と、$group を組み合わせた件数集計の手順を解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、複数のドキュメントを含むコレクションを作成します。
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21bf54b4472ed3e8e85f")
}
> db.demo555.insertOne({"CountryName":"UK"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c254b4472ed3e8e860")
}
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c354b4472ed3e8e861")
}
> db.demo555.insertOne({"CountryName":"AUS"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c554b4472ed3e8e862")
}
> db.demo555.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f21c754b4472ed3e8e863")
}ここでは「US」が3件、「UK」と「AUS」がそれぞれ1件登録されています。
2. 登録したドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo555.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e8f21bf54b4472ed3e8e85f"), "CountryName" : "US" }
{ "_id" : ObjectId("5e8f21c254b4472ed3e8e860"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e8f21c354b4472ed3e8e861"), "CountryName" : "US" }
{ "_id" : ObjectId("5e8f21c554b4472ed3e8e862"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e8f21c754b4472ed3e8e863"), "CountryName" : "US" }3. $matchで特定のフィールド値に一致させる
以下は、$match を使って「CountryName」が「US」であるドキュメントだけを抽出し、さらに $group でその件数をカウントするクエリの例です。
> db.demo555.aggregate([
... {$match: {CountryName: 'US'}},
... {$group: {_id: null, Total: {$sum: 1}}}
... ])このクエリのポイントは次のとおりです。
- $match: 指定した条件(ここでは CountryName が 'US')に一致するドキュメントのみをパイプラインの次のステージへ渡します。SQLの WHERE 句に相当します。
- $group:
_id: nullを指定することで全ドキュメントをひとつのグループにまとめ、$sum: 1によって一致した件数を合計しています。
実行結果は以下のとおりです。「US」に一致するドキュメントが3件あることがわかります。
{ "_id" : null, "Total" : 3 }まとめ
集計フレームワークでは、$match をパイプラインの先頭に置くことでインデックスを活用でき、パフォーマンスの向上も期待できます。条件による絞り込みを行い、その後 $group や $sort などのステージと組み合わせることで、柔軟なデータ集計が可能になります。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "