假设我有一个非常简单的集合,只有firstName和lastName字段,我正在使用此查询进行搜索:
{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}
我如何对结果进行排序,这样我才能得到首先与约翰和史密斯匹配的文件,然后是约翰或史密斯?我需要使用聚合吗?
感谢。
答案 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仍然是一个实验性功能,但我相信它会为您提供所需的功能。
如果您创建的文本索引同等地加权firstName
和lastName
,则查询结果将按得分的降序排列,最高得分与两个字段匹配。