使用Mongoose查询价格最大最小值出现重复结果如何解决
我在使用Mongoose查询最大、最小值时总是得到重复结果,我也尝试过先对数据库排序再限制返回第一条元素的方案,仍然出现相同问题,请问该如何操作才能仅获取一条正确结果?谢谢
你的现有代码如下:
const minAndMax = await Product.aggregate([{ "$group": { "_id": null, "max": { "$max": "$price" }, "min": { "$min": "$price" } } }]) console.log(minAndMax);
问题排查与修复方案
你当前输出的完整产品文档和你写的聚合查询逻辑不匹配,你写的$group聚合本应返回仅包含最大、最小价格的单条统计结果,而非完整的产品字段,可按以下步骤处理:
常见原因说明
- 你大概率将其他查询的打印结果和当前聚合查询的输出混淆了,先确认你打印的
minAndMax确实是该聚合语句的返回值 - 你贴出的两条输出结果
_id完全一致,MongoDB默认会为_id创建唯一索引,不会存在重复_id的文档,说明要么是你的打印逻辑重复执行了两次,要么是集合的唯一索引被意外删除导致存在重复数据。
修复方案
方案1:聚合查询正确写法
你写的聚合统计逻辑本身是正确的,只要正确取返回数组的第一个元素即可得到单条统计结果:
const aggregateResult = await Product.aggregate([ { $group: { _id: null, maxPrice: { $max: "$price" }, minPrice: { $min: "$price" } } } ]) // aggregate返回数组,_id设为null时全局仅返回1条统计结果,取第一个元素即可 const minAndMax = aggregateResult[0] console.log(minAndMax) // 预期输出格式:{ _id: null, maxPrice: 最高价格, minPrice: 最低价格 }
方案2:排序取极值对应文档
如果你需要获取价格最高/最低对应的完整产品文档,可使用以下写法,不会返回重复结果:
// 获取价格最高的单条产品 const maxProduct = await Product.find().sort({ price: -1 }).limit(1).lean() // 获取价格最低的单条产品 const minProduct = await Product.find().sort({ price: 1 }).limit(1).lean()
仍有重复的排查步骤
如果修改后还是出现重复结果,可按以下顺序排查:
- 单独执行该聚合查询,不要和其他业务逻辑混写,确认输出结果
- 在MongoDB shell中执行
db.products.count({_id: ObjectId("614355236f279d3d886f90e4")}),如果返回计数大于1,说明集合的_id唯一索引被删除,重建唯一索引即可解决重复数据问题 - 检查实际代码中是否额外添加了
$unwind、多条件分组等聚合阶段,这类逻辑会导致返回多条结果
内容的提问来源于stack exchange,提问作者DoubleYuu
相关产品推荐
相关产品推荐

