定义
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 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
比较同一文档中的两个字段
$expr 可以包含对同一文档中的字段进行比较的表达式。
以下操作使用$expr 在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 } } } ]
将 $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 计算加权分数,该分数也不会反映在返回的文档中。相反,返回的文档代表原始状态下的匹配文档。