1

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

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

如何对结果进行排序,以便我首先获得与 John 和 Smith 匹配的文档,然后是 John 或 Smith?我需要为此使用聚合吗?

谢谢。

4

2 回答 2

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}}
])
于 2013-03-15T22:51:59.320 回答
0

虽然v2.4 中的文本索引仍然是一个实验性功能,但我相信它会给你你想要的东西。

如果您创建一个文本索引的权重firstName均等lastName,则查询结果将按分数降序排列,最高分数匹配两个字段。

于 2013-03-15T22:51:09.830 回答