$expr可以构建查询表达式,以比较$match阶段中同一文档中的字段。
如果$match阶段是阶段的一部分$lookup,则
$expr可以使用let变量比较字段。有关示例,请参见
使用$ lookup指定多个联接条件。
$expr与条件语句一起使用¶某些查询要求在定义查询过滤器时能够执行条件逻辑。聚合框架为$cond运算符提供了
表达条件语句的方法。通过$expr与$cond运算符一起使用
,可以为查询语句指定条件过滤器。
supplies使用以下文档创建样本集合:
假设要在下个月进行的销售,您需要对价格进行折价,使得:
qty大于或等于100,则折扣价为的0.5 price。qty小于100,则折价为的0.75
price。在应用折扣之前,您想知道supplies集合中的哪些项目
的折扣价小于5。
以下示例使用$exprwith $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 pad5