AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$expr(クエリ述語演算子)

バージョン5.0で変更。

$expr

クエリ述語内で式を使用できます。

次の環境でホストされる配置には $expr を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

{ $expr: { <expression> } }

引数には任意の有効な式を使用できます。

$expr が $lookup サブパイプラインの一部である $match ステージに表示される場合、$expr は $lookup ステージで定義された let 変数を参照できます。例については、「複数の結合条件と相関サブクエリの使用」を参照してください。

$expr演算子に配置されている$eq 、 $lt 、 $lte 、 $gt 、および$gte比較演算子は、 $lookupステージで参照されるfromコレクションのインデックスを使用できます。 制限:

  • インデックスはフィールドと定数の比較にのみ使用できるため、let オペランドは定数に変換する必要があります。

    たとえば、$a と定数値の比較にはインデックスを使用できますが、$a と $b の比較には使用できません。

  • let オペランドが空の値または欠損値に変換される場合の比較には、インデックスは使用されません。

  • マルチキー、部分、またはスパースインデックスは使用されません。

このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。

$expr は、同じドキュメントのフィールドを比較する式を含めることができます。

次の操作では、$expr を使用して、Rotten ユーザーの評価が批評家の評価を超えている moviesコレクション内のドキュメントを検索します。

db.movies.find( { $expr: { $gt: [ "$tomatoes.viewer.rating", "$tomatoes.critic.rating" ] } }, { _id: 0, title: 1, "tomatoes.viewer.rating": 1, "tomatoes.critic.rating": 1 }).sort( { "tomatoes.viewer.rating": -1 } ).limit( 3 )
[ { title: 'I Am Maria', tomatoes: { viewer: { rating: 5 } } }, { title: 'Kadin Hamlet', tomatoes: { viewer: { rating: 5 } } }, { title: 'The Seine Meets Paris', tomatoes: { viewer: { rating: 5 } } }]

一部のクエリでは、クエリフィルターを定義するときに条件ロジックを実行する必要があります。集計パイプラインには、条件ステートメントを表現するための $cond 演算子が用意されています。$expr を $cond 演算子とともに使用することで、クエリ ステートメントに条件付きフィルターを指定できます。

評価の高い映画で投票数の少ない映画が結果を専有しないように、映画の重み付きスコアを計算するとします。

  • imdb.votes が 1000 以上の場合、重み付けされたスコアは完全な imdb.rating になります。

  • imdb.votes が 1000 より小さい場合、重み付けされたスコアは imdb.rating の 0.5 になります。

moviesコレクション内のどの映画の重みが 9 よりも大きいかを調べたい。

次の例では、$expr を使用し、$cond と imdb.votes および $gt に基づいて重み付けされたスコアを計算し、計算された重み付けされたスコアが 9 より大きいドキュメントを返します。

db.movies.find( { "imdb.rating": { $type: "number" }, "imdb.votes": { $type: "number" }, $expr: { $gt: [ { $cond: { if: { $gte: ["$imdb.votes", 1000] }, then: { $multiply: ["$imdb.rating", 1.0] }, else: { $multiply: ["$imdb.rating", 0.5] } } }, 9 ] } }, { _id: 0, title: 1, "imdb.rating": 1, "imdb.votes": 1 }).sort( { title: 1 } ).limit(5)

次の表は、選択したドキュメントの重みスコアと、重みスコアが 9 より大きいかどうかを示しています(つまり、ドキュメントがクエリ条件を満たしているかどうか)。

ドキュメント
重みのあるスコア
> 9

{ title: "The Shawshank Redemption", imdb: { rating: 9.3, votes: 1521105 } }

9.3

true

{ title: "The Godfather", imdb: { rating: 9.2, votes: 1038358 } }

9.2

true

{ title: "Fight Club", imdb: { rating: 8.9, votes: 1191784 } }

8.9

false

{ title: "Planet Earth", imdb: { rating: 9.5, votes: 82896 } }

9.5

true

{ title: "Hollywood", imdb: { rating: 9.1, votes: 511 } }

4.55

false

db.collection.find()操作では、計算された重みスコアが 9 を超える 5 ドキュメントが返されます。

[ { title: 'Band of Brothers', imdb: { rating: 9.6, votes: 183802 } }, { title: 'Baseball', imdb: { rating: 9.1, votes: 2460 } }, { title: 'Cosmos', imdb: { rating: 9.3, votes: 17174 } }, { title: 'Frozen Planet', imdb: { rating: 9.2, votes: 5903 } }, { title: 'Human Planet', imdb: { rating: 9.2, votes: 9057 } }]

$cond は重み付けされたスコアを計算しますが、そのスコアは返されるドキュメントには反映されません。その代わり、返されるドキュメントは、一致したドキュメントをオリジナルの状態で表現します。

このページを評価