如何按Subjects是否含Math排序MongoDB查询结果?
解决方案
要实现先将Subjects数组包含"Math"的学生排在前面,再按marks降序的排序规则,不能直接通过字段值排序,需要用MongoDB的$expr表达式生成一个布尔判断结果,以此作为第一排序条件:
正确配置代码
opts.Sort = bson.D{ // 生成布尔值:包含"Math"则为true,否则为false,降序排列让true的结果在前 {Key: "$expr", Value: bson.D{ {Key: "$in", Value: bson.A{"Math", "$subjects"}}, }}, // 再按marks降序排序 {Key: "marks", Value: -1}, }
原写法错误原因
你之前直接用subjects字段搭配$in的写法不符合MongoDB排序规则:
- 直接指定字段排序时,MongoDB会按数组本身的字典序进行排序,而非判断数组是否包含某个元素
$in是查询操作符,不能直接用于排序的字段值配置
补充说明
$in在$expr中会检查"Math"是否存在于$subjects数组中,返回true或false。由于MongoDB中布尔值true等价于1,false等价于0,按降序(-1)排序时,包含"Math"的学生就会排在前面,之后再按marks从高到低排序。
内容的提问来源于stack exchange,提问作者Rajat Singh
相关产品推荐
相关产品推荐

