$expr
可以构建查询表达式,以比较$match
阶段中同一文档中的字段。
如果$match
阶段是阶段的一部分$lookup
,则
$expr
可以使用let
变量比较字段。有关示例,请参见
使用$ lookup指定多个联接条件。
$expr
与条件语句一起使用¶某些查询要求在定义查询过滤器时能够执行条件逻辑。聚合框架为$cond
运算符提供了
表达条件语句的方法。通过$expr
与$cond
运算符一起使用
,可以为查询语句指定条件过滤器。
supplies
使用以下文档创建样本集合:
假设要在下个月进行的销售,您需要对价格进行折价,使得:
qty
大于或等于100,则折扣价为的0.5 price
。qty
小于100,则折价为的0.75
price
。在应用折扣之前,您想知道supplies
集合中的哪些项目
的折扣价小于5
。
以下示例使用$expr
with $cond
来基于qty
和$lt
计算折扣价,并
返回其折扣价小于的文档NumberDecimal("5")
:
下表显示了每个文档的折扣价以及折扣价是否小于NumberDecimal("5")
(即,文档是否满足查询条件)。
文献 | 打折后价格 | <NumberDecimal(“ 5”) |
---|---|---|
{“ _id”:1,“ item”:“ binder”,“ qty”:100,“ price”:NumberDecimal(“ 12”)} | NumberDecimal(“ 6.00”) | false |
{“ _id”:2,“ item”:“ noteboook”,“ qty”:200,“ price”:NumberDecimal(“ 8”)} | NumberDecimal(“ 4.00”) | true |
{“ _id”:3,“ item”:“ pencil”,“ qty”:50,“ price”:NumberDecimal(“ 6”)} | NumberDecimal(“ 4.50”) | true |
{“ _id”:4,“ item”:“ eraser”,“ qty”:150,“ price”:NumberDecimal(“ 3”)} | NumberDecimal(“ 1.50”) | true |
{“ _id”:5,“ item”:“ legal pad”,“ qty”:42,“ price”:NumberDecimal(“ 10”)} | NumberDecimal(“ 7.50”) | false |
该db.collection.find()
操作返回的折扣价小于的凭证NumberDecimal("5")
:
即使$cond
计算出有效的折价,该价格也不会反映在返回的单据中。而是,返回的文档以其原始状态表示匹配的文档。由于其折扣价大于,查找操作未返回binder
或文档
。legal pad
5