假设我有一个只有 firstName 和 lastName 字段的非常简单的集合,并且我正在使用以下查询进行搜索:
{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}
如何对结果进行排序,以便我首先获得与 John 和 Smith 匹配的文档,然后是 John 或 Smith?我需要为此使用聚合吗?
谢谢。
假设我有一个只有 firstName 和 lastName 字段的非常简单的集合,并且我正在使用以下查询进行搜索:
{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}
如何对结果进行排序,以便我首先获得与 John 和 Smith 匹配的文档,然后是 John 或 Smith?我需要为此使用聚合吗?
谢谢。
好吧,我认为您需要使用聚合。我会使用这样的查询:
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}}
])
虽然v2.4 中的文本索引仍然是一个实验性功能,但我相信它会给你你想要的东西。
如果您创建一个文本索引的权重firstName
均等lastName
,则查询结果将按分数降序排列,最高分数匹配两个字段。