You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合查询:如何按price值最接近92执行$sort排序

MongoDB聚合:按price最接近指定值排序

嘿,我来帮你搞定这个MongoDB聚合排序的需求!要实现按price最接近92的规则排序,我们需要在聚合管道里先计算每个文档的价格与92的绝对差值,再基于这个差值进行升序排序。另外得注意调整管道顺序,先排序再执行$limit——如果先取3条再排序,只会对随机返回的3条数据排序,达不到“找最接近92的3个”的效果。

修改后的聚合语句

db.units.aggregate([
  {$match: {category: 'a'}},
  {$addFields: {priceDiff: {$abs: {$subtract: ['$price', 92]}}}}, // 计算price与92的绝对差值
  {$sort: {priceDiff: 1}}, // 按差值升序排列(差值越小越接近92)
  {$limit: 3}, // 取排序后的前3条结果
  {$project: {price:1, name: 1, category: 1}} // 移除临时字段,保留需要的字段
]);

各步骤详解

  • $match:和你原语句一样,先过滤出category为'a'的文档,缩小处理范围。
  • $addFields:新增临时字段priceDiff,用$subtract算出price和92的差值,再用$abs取绝对值——这样不管价格比92高还是低,差值都是正数,方便统一排序。
  • $sort:按照priceDiff升序排序,差值越小的文档(也就是价格越接近92的)会排在最前面。
  • $limit:获取排序后的前3条数据,确保拿到的是最接近92的3个结果。
  • $project:移除我们临时用的priceDiff字段,只保留你需要的price、name和category字段。

最终执行结果

基于你提供的现有数据,执行上述语句后会得到如下结果:

[
  {'_id': '222', 'price': 90, 'name': 'efg', 'category': 'a'},
  {'_id': '111', 'price': 100, 'name': 'abc', 'category': 'a'},
  {'_id': '333', 'price': 80, 'name': 'xyz', 'category': 'a'}
]

这里90和92的差值是2,100和92的差值是8,80和92的差值是12,完全符合“按与92的差值从小到大排序”的要求。

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:25:38