我想通过在其他项目之前放置具有特定值的项目来对集合进行排序。
例如,我希望"getthisfirst": "yes"
的所有项目都在所有其他项目之前。
{"getthisfirst": "yes"}
{"getthisfirst": "yes"}
{"getthisfirst": "no"}
{"getthisfirst": "maybe"}
答案 0 :(得分:5)
这作为一般概念称为“加权”。因此,如果没有任何其他机制,那么您可以通过逻辑方式将“权重”的值“投影”到文档中来逻辑地处理MongoDB查询。
“投影”和更改文档中存在的字段的方法是.aggregate()
方法,特别是$project
管道阶段:
db.collection.aggregate([
{ "$project": {
"getthisfirst": 1,
"weight": {
"$cond": [
{ "$eq": [ "$getthisfirst", "yes" ] },
10,
{ "$cond": [
{ "$eq": [ "$getthisfirst", "maybe" ] },
5,
0
]}
]
}
}},
{ "$sort": { "weight": -1 } }
]);
这里的$cond
运算符是"ternary"(if / then / else)条件,其中第一个参数是到达布尔值true|false
的条件语句。如果true
“则”返回第二个参数作为结果,否则返回“else”或第三个参数作为响应。
在这个“嵌套”的情况下,那么“是”是一个匹配,然后分配一定的“权重”分数,否则我们继续进行下一个条件测试,其中“可能”是一个匹配然后anoter得分是已分配,或以其他方式得分为0
,因为我们只有三个可匹配的职位。
然后应用$sort
条件,以便按顺序“排序”(以降序排列)具有最大“权重”的结果。