为何MongoDB聚合查询返回全部文档而非符合条件的文档?
MongoDB聚合查询过滤数组元素失败问题
问题场景
集合Schema结构如下:
_id: ObjectId('631b875491b16c38eecfa4e9') brandName: "Nick" categories: Array 0: ObjectId('62f3eaff3ded19dcce71081e') 1: ObjectId('62f3eb283ded19dcce710824') products: Array 0: Object productName: "Vans Shoes dsds Old Skool" description: "amazing Shoes." categoryId: ObjectId('62f3eaff3ded19dcce71081e') price: 240 _id: ObjectId(631b875491b16c38eecfa4ec) 1: Object 2: Object 3: Object __v: 0
目标是仅返回products数组中价格大于等于minPrice的元素,但当前查询返回了所有产品,包括价格低于阈值的。
错误的聚合查询代码:
const products = await Brand.aggregate([ { $match: { _id: ObjectId(brandId) } }, { $project: { products: { $filter: { input: "$products", as: "product", cond: { $gte: ["$$product.price", +!!minPrice] }, } } } } ])
问题原因
问题出在cond条件里的+!!minPrice:
!!minPrice会把minPrice转换为布尔值:若minPrice是合法数字(如100),结果为true;若为0或空值,结果为false。- 前缀
+会把布尔值转为数字:true变成1,false变成0。 - 这导致过滤条件实际变成
$$product.price >= 1或>=0,几乎所有产品都会被保留,完全没用到真实的minPrice数值。
修正方案
直接使用minPrice本身,确保其为数字类型即可:
const products = await Brand.aggregate([ { $match: { _id: ObjectId(brandId) } }, { $project: { products: { $filter: { input: "$products", as: "product", cond: { $gte: ["$$product.price", Number(minPrice)] }, } } } } ])
如果需要处理minPrice为空的场景,可添加判断逻辑,空值时返回所有产品:
const filterCond = minPrice ? { $gte: ["$$product.price", Number(minPrice)] } : { $gte: ["$$product.price", 0] }; const products = await Brand.aggregate([ { $match: { _id: ObjectId(brandId) } }, { $project: { products: { $filter: { input: "$products", as: "product", cond: filterCond } } } } ])
内容的提问来源于stack exchange,提问作者saar twito
相关产品推荐
相关产品推荐

