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
相关产品推荐
相关产品推荐

