$match (ドキュメントのフィルター)
最終更新:2026-10-09
$match (ドキュメントのフィルター)
$match は、クエリ条件でドキュメントをフィルターし、一致したものだけを後続のステージに渡します。find() のクエリ述語に相当する集計版のフィルターです。$match はできるだけ先頭に置きましょう — インデックスを使える上、後続ステージに入るドキュメント数を減らせるため、集計パフォーマンスの第一の鉄則です。
| カテゴリ | コアステージ |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $match: { <query> } }
⚙️ パラメータ
| クエリ条件 | find() と同じクエリ式。比較・論理・要素演算子をサポートします。 |
|---|
戻り値:フィルタリングされたドキュメントストリーム(次のステージ用)
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $match: ステータスが A の注文だけに絞る
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
出力:
// 顧客ごとの合計を返す
{ "_id": "A123", "total": 250 }
{ "_id": "B456", "total": 130 }
📌 注意事項
- $match を先頭に置いてインデックスを活用する
- $match 内では $where や $text は使えない($text は先頭ステージである必要がある)
- インデックスの最適化は $match ステージまでで止まる
🏷️ 関連タグ
💡 関連ケース
高度な集計パイプライン:複雑な式と変換
集計パイプライン入門:aggregateメソッドと基本ステージ
Change Streams:リアルタイム変更監視
$facet + $bucket + テキスト/地理空間検索
$lookupと複数コレクションの関連付け
Mongooseスキーマ設計と埋め込み vs 参照
📚 関連チュートリアル
❓ よくある質問
Q$match と find() の違いは?
Aクエリ条件は同じですが、$match は集計パイプライン内で使い、結果を次のステージに渡します。
Q$match はパイプラインの途中に置けますか?
A置けますが、インデックスの最適化が失われます。可能な限り先頭に置くのが定石です。
Qなぜ $match をパイプラインの先頭に置くのですか?
A早い段階で絞り込むと後続ステージに渡るデータ量が減り、さらに $match がインデックスを使えるため、パフォーマンスが大幅に向上します。後ろに置いても動作しますが、インデックスは使えません。