MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBの集計パイプラインで$matchと$projectを使う方法

MongoDBの集計(アグリゲーション)パイプラインにおいて、$match$project は最もよく使われるステージの2つです。それぞれの役割を理解しておくことで、柔軟なデータ処理が可能になります。

$matchと$projectの基本

$match は、指定した条件に一致するドキュメントだけをフィルタリングし、次のパイプラインステージへ渡す役割を持ちます。SQLのWHERE句に相当する機能です。

$project は、次のステージへ渡すドキュメントから、必要なフィールドだけを選択・整形する役割を持ちます。SQLのSELECT句のようなイメージです。

サンプルコレクションの作成

それでは、実際に例を見ていきましょう。まず、ドキュメントを含むコレクションを作成します。

> db.demo545.insert({Name:"Chris",details:{SubjectScore1:56,SubjectScore2:56}})
WriteResult({ "nInserted" : 1 })
> db.demo545.insert({Name:"David",details:{SubjectScore1:78,SubjectScore2:78}})
WriteResult({ "nInserted" : 1 })

登録データの確認

find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.demo545.find();

このクエリを実行すると、以下のような出力が得られます。

{ "_id" : ObjectId("5e8e246e9e5f92834d7f05d5"), "Name" : "Chris", "details" : { "SubjectScore1" : 56, "SubjectScore2" : 56 } }
{ "_id" : ObjectId("5e8e24709e5f92834d7f05d6"), "Name" : "David", "details" : { "SubjectScore1" : 78, "SubjectScore2" : 78 } }

$matchと$projectを組み合わせたクエリ

続いて、$match と $project を実装するクエリを見てみましょう。

> db.demo545.aggregate([
   {$match:{}},
   {$project:{"_id":0, "details.SubjectScore1":1, out:"$details.SubjectScore2"}},
   {$group:{_id:"$out"}}
])

このパイプラインでは、まず $match で全ドキュメントを通過させ、次に $project で _id を除外しつつ SubjectScore1 を残し、SubjectScore2 を「out」という新しいフィールドとして出力しています。最後に $group で out の値ごとにグループ化しています。

実行すると、以下の出力が得られます。

{ "_id" : 78 }
{ "_id" : 56 }

まとめ

$match による絞り込みと $project によるフィールド選択を組み合わせることで、不要なデータを排除しながら、目的の形式に整えたデータを後段のステージへ渡せます。大量のドキュメントを扱う場合は、できるだけ早いステージで $match を使って絞り込むことで、パフォーマンスの向上も期待できます。

  1. PythonでMongoDBを操作する方法|pymongoを使った基本操作入門

    MongoDBは広く利用されているドキュメント指向データベースであり、NoSQLデータベースの一種です。Pythonはpymongoなどのモジュールを介してMongoDBと連携し、データの作成や操作を行うことができます。本記事では、その具体的な方法を解説します。なお、PythonからMongoDBへ接続するには、システムにMongoDBがあらかじめインストールされている必要があります。MongoDBのセットアップ手順については、専用のチュートリアル記事をご参照ください。 pymongoのインストール MongoDBとやり取りするには、pymongoというモジュールが必要です。以下のコマンドを

  2. MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説

    MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db