MongoDB - 按匹配字段的数量对结果进行排序

时间:2013-03-15 20:33:23

标签: mongodb

假设我有一个非常简单的集合,只有firstName和lastName字段,我正在使用此查询进行搜索:

{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}

我如何对结果进行排序,这样我才能得到首先与约翰和史密斯匹配的文件,然后是约翰或史密斯?我需要使用聚合吗?

感谢。

2 个答案:

答案 0 :(得分:1)

好吧,我认为你需要使用聚合。我会使用这样的查询:

db.yourcollection.aggregate([

    /* Match documents with firstName == "John" OR lastName == "Smith" */
    {
        $match:{
            $or:[
                {firstName:"John"},
                {lastName:"Smith"}
            ]
        }
    },

    /* Project data creating a new field named "good".
       With the comparisons good will be true if
       firstName == "John" AND lastName == "Smith" */
    {
        $project:{
            _id:1,
            firstName:1,
            lastName:1,
            good:{
                $and:[
                    {$eq:["$firstName","John"]},
                    {$eq:["$lastName","Smith"]}
                ]
            }
        }
    },

    /* Sort by "good", descending, so true values come first */
    {$sort:{good:-1}}
])

答案 1 :(得分:0)

虽然v2.4中的text indexes仍然是一个实验性功能,但我相信它会为您提供所需的功能。

如果您创建的文本索引同等地加权firstNamelastName,则查询结果将按得分的降序排列,最高得分与两个字段匹配。