Mongoose聚合管道中如何为数组对象筛选添加字段比较条件(withdrawn < amount)
Mongoose聚合管道中如何为数组对象筛选添加字段比较条件(withdrawn < amount)
嗨,我来帮你搞定这个问题!你已经通过$elemMatch实现了对product和unit的匹配,现在要加上withdrawn < amount的条件,核心在于使用$expr来实现同一个数组元素内的字段比较——因为普通的查询条件只能和常量对比,没法直接引用并比较两个字段的值。
你只需要在$elemMatch的条件里加入$expr表达式,用来指定withdrawn小于amount的逻辑即可,修改后的代码如下:
pipeline.push({ $match: { items: { $elemMatch: { product: mongoose.Types.ObjectId(product), unit: mongoose.Types.ObjectId(unit), $expr: { $lt: ["$withdrawn", "$amount"] } } } } })
简单解释下这段代码的逻辑:
$elemMatch确保数组中至少存在一个元素同时满足所有指定条件;$expr允许我们在查询中使用聚合表达式,这里的$lt操作符用来对比当前数组元素的withdrawn和amount字段;"$withdrawn"和"$amount"是对当前数组元素内对应字段的引用,不需要额外的路径前缀,因为$elemMatch的上下文已经限定在单个数组元素上了。
这样修改后,你的聚合管道就能精准筛选出符合以下条件的文档:items数组中存在至少一个元素,匹配指定的product ID、unit ID,并且该元素的withdrawn值小于amount值。
备注:内容来源于stack exchange,提问作者Hector Toro
相关产品推荐
相关产品推荐

