按值mongodb排序项目

ram*_*ght 2 mongodb mongodb-query aggregation-framework

我想通过在其他项之前放置具有特定值的项来对集合进行排序.

例如,我希望所有项目"getthisfirst": "yes"都在其他所有项目之前.

{"getthisfirst": "yes"}
{"getthisfirst": "yes"}
{"getthisfirst": "no"}
{"getthisfirst": "maybe"}
Run Code Online (Sandbox Code Playgroud)

Bla*_*ven 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 } }
]);
Run Code Online (Sandbox Code Playgroud)

$cond这里的运算符是"三元"(if/then/else)条件,其中第一个参数是到达布尔值的条件语句true|false.如果true"then"则返回第二个参数作为结果,否则返回"else"或第三个参数作为响应.

在这个"嵌套"的情况下,那么"是"是一个匹配,然后分配一定的"权重"分数,否则我们继续进行下一个条件测试,其中"可能"是一个匹配,然后分配anoter分数,或者否则得分是0因为我们只有三个匹配的可能性.

然后$sort应用条件,以便在顶部以"最大"权重"按顺序"(以降序排列)结果.