如何扩展MongoDB $match,基于alertDirection与变量匹配数组元素?
实现动态匹配alerts数组元素的MongoDB查询
完全可行,MongoDB 6.0.3支持通过$expr结合聚合操作符,在$match的$elemMatch条件中实现这种动态逻辑判断。
核心实现思路
利用$cond操作符根据alertDirection的值,动态选择对应的比较规则,再结合自定义变量myValue完成匹配。以下是具体的查询示例:
db.collection.find( { alerts: { $elemMatch: { location: "home", available: true, $expr: { $cond: [ { $eq: ["$alertDirection", "$lte"] }, { $gte: ["$alertValue", "$$myValue"] }, { $cond: [ { $eq: ["$alertDirection", "$gte"] }, { $lte: ["$alertValue", "$$myValue"] }, false // 非指定alertDirection时不匹配 ] } ] } } } }, { let: { myValue: 10 } } // 传入自定义变量值,按需修改即可 )
逻辑说明
- 当
alertDirection为$lte时,匹配alertValue ≥ myValue的元素(对应你示例中myValue=10的场景) - 当
alertDirection为$gte时,匹配alertValue ≤ myValue的元素(对应你示例中myValue=100的场景) - 若
alertDirection为其他值,该数组元素不会被匹配
你只需修改let中的myValue参数,即可切换不同的匹配规则。
内容的提问来源于stack exchange,提问作者errata
相关产品推荐
相关产品推荐

