按值mongodb排序项目

时间:2015-08-08 16:42:52

标签: mongodb mongodb-query aggregation-framework

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

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

{"getthisfirst": "yes"}
{"getthisfirst": "yes"}
{"getthisfirst": "no"}
{"getthisfirst": "maybe"}

1 个答案:

答案 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条件,以便按顺序“排序”(以降序排列)具有最大“权重”的结果。