MongoDB聚合查询:如何按price.v2状态筛选价格>20的商品
MongoDB聚合查询实现动态价格筛选
场景说明
产品的Schema结构如下:
{ price: { v1: number, // 必填且非空 v2: number // 非必填,允许为空或不存在 } }
需要筛选价格大于20的商品,判断规则:
- 当
price.v2为空(或字段不存在)时,用price.v1 > 20判断 - 当
price.v2非空时,用price.v2 > 20判断
实现方式一:直接在$match中动态判断
利用$expr结合$ifNull函数,直接在匹配阶段完成动态价格判断,无需额外字段:
db.products.aggregate([ { $match: { $expr: { $gt: [ // 如果v2为空/不存在,返回v1;否则返回v2 { $ifNull: ["$price.v2", "$price.v1"] }, 20 ] } } } ])
实现方式二:先计算有效价格再筛选
如果后续聚合流程还需要用到这个动态计算的价格,可以先通过$addFields添加临时字段,再进行筛选:
db.products.aggregate([ { $addFields: { // 生成有效价格字段 effectivePrice: { $ifNull: ["$price.v2", "$price.v1"] } } }, { // 根据有效价格筛选 $match: { effectivePrice: { $gt: 20 } } }, // 可选:如果不需要保留effectivePrice,移除该字段 { $project: { effectivePrice: 0 } } ])
内容的提问来源于stack exchange,提问作者Tommaso Merlini
相关产品推荐
相关产品推荐

