根据正则表达式排序Mongodb find()输出

时间:2016-08-01 20:16:54

标签: regex mongodb sorting

db.restaurant_info.find({name:/pi/i})

以上mongodb查询以DB格式返回数据

{
    "_id" : ObjectId("579cf26204aba69a41da82ad"),
    "name" : "pizza hut",
    "type" : "restaurant"
}

/* 2 */
{
    "_id" : ObjectId("579cf26204aba69a41da82af"),
    "name" : "Kai pi",
    "type" : "restaurant"
}

/* 3 */
{
    "_id" : ObjectId("579cf26404aba69a41da82c7"),
    "name" : "pizza and pasta",
    "type" : "restaurant"
}

/* 4 */
{
    "_id" : ObjectId("579cf26504aba69a41da82d0"),
    "name" : "Crispi chicken",
    "type" : "restaurant"
}

/* 5 */
{
    "_id" : ObjectId("579cf26504aba69a41da82d1"),
    "name" : "Pita house",
    "type" : "restaurant"
}

但是,此查询将用于自动填充,因此如果我在搜索文本字段中使用pi,则所有以pi开头的重新记录应该出现在其他记录之前,例如序列我是期待:

Pizza hut
Pizza and pasta
Pita house
Kai pi
Crispi chicken

如果我使用db.restaurant_info.find({name:/^pi/i})修改查询, 然后它返回

Pizza hut
Pizza and pasta
Pita house

Kai pi
Crispi Chicken

请指导我应该使用哪个查询来获得我期望的序列。

1 个答案:

答案 0 :(得分:0)

我不知道如何使用 find()执行此操作,但您可以使用 aggregate()执行此操作。

首先,您将正则表达式用于 $ match ,然后您可以将 $ project $ substring $一起使用eq 投影一个字段,指示您是否有前缀匹配。然后,您可以使用该字段对结果进行排序。这是一个例子。我还使用了 $ toLower ,这样您的排序就会不区分大小写。

{
    $match: {
        name:/pi/i
    }
}, 
{
    $project: {
        name:true,
        regex_match: {
            $eq: [
                "pi", 
                { $substr: [ {$toLower: "$name"}, 0, 2 ] }
            ]
        }

    }
}, 
{
    $sort: {regex_match:-1}
}