定義
バージョン 5.0 での変更。
互換性
次の環境でホストされる配置には $expr を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
{ $expr: { <expression> } }
引数には任意の有効な式を使用できます。
動作
$lookup 操作の $expr
$expr が $lookup サブパイプラインの一部である $match ステージに表示される場合、$expr は $lookup ステージで定義された let 変数を参照できます。例については、「複数の結合条件と相関サブクエリの使用」を参照してください。
$expr演算子に配置されている$eq 、 $lt 、 $lte 、 $gt 、および$gte比較演算子は、 $lookupステージで参照されるfromコレクションのインデックスを使用できます。 制限:
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
1 つのドキュメントの 2 つのフィールドの比較
$expr は、同じドキュメントのフィールドを比較する式を含めることができます。
次の操作では、$expr を使用して、Rottenmovies ユーザーの評価が批評家の評価を超えている コレクション内のドキュメントを検索します。
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 } } } ]
条件文での$exprの使用
一部のクエリでは、クエリフィルターを定義するときに条件ロジックを実行する必要があります。集計パイプラインには、条件ステートメントを表現するための 演算子が用意されています。$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 |
|---|---|---|
| 9.3 |
|
| 9.2 |
|
| 8.9 |
|
| 9.5 |
|
| 4.55 |
|
操作では、計算された重みスコアがdb.collection.find() 5を超える ドキュメントが返されます。9
[ { 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は重み付けされたスコアを計算しますが、そのスコアは返されるドキュメントには反映されません。その代わり、返されるドキュメントは、一致したドキュメントをオリジナルの状態で表現します。