使用sort方法后MongoDB聚合数据未排序,查询结果索引随机变化
MongoDB排序问题解决方案
问题根源
- 排序不生效:你的
$sort阶段指定的bloodgroup字段在$group阶段后已不存在。$group阶段将bloodgroup设为分组的_id,因此排序字段应改为_id而非原字段名。 - 返回顺序不稳定:当没有明确有效的排序条件时,MongoDB不会保证返回数据的固定顺序,每次查询的结果顺序可能随查询计划或数据分布随机变化。
基础修复(按血型字符串自然排序)
将$sort阶段的字段改为_id即可实现基础排序:
app.get('/ot1', async(req, res)=>{ const b = await dModel.aggregate([ { $match:{ bloodgroup:{ $in:["A+", "B+", "O+", "AB+", "A-", "B-", "O-", "AB-"] } } },{ $group:{ _id: "$bloodgroup", total:{ $sum: "$ml" } } }, { "$sort": { "_id": 1 } }, // 修改为_id字段排序 ]); console.log(b); console.log("-----------------"); });
进阶修复(按指定血型顺序排序)
如果需要严格按照["A+", "B+", "O+", "AB+", "A-", "B-", "O-", "AB-"]的顺序返回(字符串自然排序会把A-排在A+前面,不符合需求),可以通过添加排序权重实现:
app.get('/ot1', async(req, res)=>{ const bloodOrder = ["A+", "B+", "O+", "AB+", "A-", "B-", "O-", "AB-"]; const b = await dModel.aggregate([ { $match:{ bloodgroup:{ $in: bloodOrder } } },{ $group:{ _id: "$bloodgroup", total:{ $sum: "$ml" } } }, { $addFields: { sortWeight: { $indexOfArray: [bloodOrder, "$_id"] } // 获取血型在指定数组中的索引作为排序权重 } }, { "$sort": { "sortWeight": 1 } }, // 按权重排序 { "$project": { sortWeight: 0 } } // 可选:移除临时生成的sortWeight字段 ]); console.log(b); console.log("-----------------"); });
内容的提问来源于stack exchange,提问作者dmx
相关产品推荐
相关产品推荐

