【发布时间】:2013-03-16 21:05:55
【问题描述】:
假设我有一个只有名字和姓氏字段的非常简单的集合,并且我正在使用以下查询进行搜索:{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}
如何对结果进行排序,以便获得先匹配 John 和 Smith,然后匹配 John 或仅匹配 Smith 的文件?我需要为此使用聚合吗?
谢谢。
【问题讨论】:
标签: mongodb
假设我有一个只有名字和姓氏字段的非常简单的集合,并且我正在使用以下查询进行搜索:{"$or:[{"firstName":"John"},{"lastName":"Smith"}]}
如何对结果进行排序,以便获得先匹配 John 和 Smith,然后匹配 John 或仅匹配 Smith 的文件?我需要为此使用聚合吗?
谢谢。
【问题讨论】:
标签: mongodb
好吧,我认为您需要使用聚合。我会使用这样的查询:
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 中的 text indexes 仍然是一个实验性功能,但我相信它会给你想要的。
如果您创建的文本索引对firstName 和lastName 的权重相同,则查询结果将按分数降序排列,最高分数匹配两个字段。
【讨论】: