MongoDB中按5.0/4.0/3.0/SC顺序排序propertyRating字段的方法
解决方案
问题出在MongoDB的类型排序规则:字符串类型的"SC"在降序排序时会排在数字类型的5.0/4.0/3.0之前。要实现指定顺序,需要通过自定义权重字段来控制排序逻辑:
- 在聚合管道中添加
$addFields阶段,给不同的propertyRating值分配对应的排序优先级:- 5.0 → 4(最高优先级)
- 4.0 → 3
- 3.0 → 2
- SC → 1(最低优先级)
- 按这个权重字段降序排序,就能得到你要的顺序。
修改后的聚合管道PHP代码如下:
Array ( [0] => Array ( [$match] => Array ( [total_charges] => Array ( [$gt] => 0 ) ) ) [1] => Array ( [$addFields] => Array ( [sortPriority] => Array ( [$switch] => Array ( [branches] => Array ( [0] => Array ( [case] => Array ( [$eq] => Array ( [0] => $propertyRating [1] => 5.0 ) ) [then] => 4 ) [1] => Array ( [case] => Array ( [$eq] => Array ( [0] => $propertyRating [1] => 4.0 ) ) [then] => 3 ) [2] => Array ( [case] => Array ( [$eq] => Array ( [0] => $propertyRating [1] => 3.0 ) ) [then] => 2 ) [3] => Array ( [case] => Array ( [$eq] => Array ( [0] => $propertyRating [1] => "SC" ) ) [then] => 1 ) ) [default] => 0 ) ) ) ) [2] => Array ( [$sort] => Array ( [sortPriority] => -1 ) ) [3] => Array ( [$skip] => 0 ) [4] => Array ( [$limit] => 20 ) // 如果不需要返回sortPriority字段,可以添加$project阶段移除它 // [5] => Array // ( // [$project] => Array // ( // [sortPriority] => 0 // // 这里列出你需要保留的其他字段,或者用1保留所有字段 // [_id] => 1 // [propertyRating] => 1 // [total_charges] => 1 // ) // ) )
原理说明
$switch操作符根据propertyRating的不同值返回对应的权重数字,数字越大排序越靠前- 按
sortPriority降序排序,就能保证5.0→4.0→3.0→SC的顺序 - 如果不需要在结果中保留
sortPriority字段,可以加上$project阶段将其排除
内容的提问来源于stack exchange,提问作者Mamta Malvi
相关产品推荐
相关产品推荐

