Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

$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 を使用して、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 } } }
]

一部のクエリでは、クエリフィルターを定義するときに条件ロジックを実行する必要があります。集計パイプラインには、条件ステートメントを表現するための 演算子が用意されています。$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() 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は重み付けされたスコアを計算しますが、そのスコアは返されるドキュメントには反映されません。その代わり、返されるドキュメントは、一致したドキュメントをオリジナルの状態で表現します。

戻る

その他

項目一覧