$expr (集計式クエリ)
最終更新:2026-10-09
$expr (集計式クエリ)
$expr は、クエリ条件で集計式を使えるようにします。同一ドキュメント内の複数フィールドの比較や、集計演算子の呼び出しができます。`{ $expr: { $gt: ['$price', '$cost'] } }` は仕入れ値より高い販売価格の商品を探します。$ プレフィックスはフィールド値を参照します。$expr は基本的にインデックスを使えません(MongoDB 6.0 以降は一部サポート)ので、大規模コレクションでは控えめに使いましょう。
| カテゴリ | 要素と評価 |
|---|---|
| MongoDB バージョン | 3.6+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $expr: { <aggregation expression> } }
⚙️ パラメータ
| 集計式 | 集計式(例: { $gt: ['$price', '$cost'] })。$ はフィールド値を参照します。 |
|---|
戻り値:一致するドキュメントのカーソル
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $expr: 仕入れ値より高い価格の商品
// $price はフィールド値を参照
db.products.find({ $expr: { $gt: ['$price', '$cost'] } })
// 2 つのフィールドが等しいか比較
db.users.find({ $expr: { $eq: ['$email', '$username'] } })
出力:
// price が cost を超える商品と、email が username と等しいユーザーを返す
📌 注意事項
- $ プレフィックスは集計パイプラインと同じくフィールド値を参照する
- 基本的にインデックスは使えない。6.0 以降は一部サポート
- 素の演算子で表現できるクエリはそちらを優先する
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$expr で 1 つのドキュメント内の 2 つのフィールドを比較するには?
A$ でフィールドを参照します: { $expr: { $gt: ['$price', '$cost'] } }。
Q$expr はインデックスを使えますか?
A通常は使えません。MongoDB 6.0 以降は一部のケース(範囲比較など)でインデックスを使えます。
Q$expr と $where の違いは?
A$expr は集計式を使います(推奨)。$where は JavaScript を実行し、遅くインデックスも使えません。