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