2013-03-08 35 views
1

我有一个名称的mongo数据库。在mongodb中查找一个文件,偏好“开始于”

比方说,它看起来像这样:

{ "_id" : ObjectId("513a18c1f9e9b5c19fd80014"), "name" : "Mary Sue" } 
{ "_id" : ObjectId("513a18d9f9e9b5c19fd80015"), "name" : "Tammy Sue" } 
{ "_id" : ObjectId("513a18e4f9e9b5c19fd80016"), "name" : "Sueellen" } 
{ "_id" : ObjectId("513a18eaf9e9b5c19fd80017"), "name" : "Ellen" } 
{ "_id" : ObjectId("513a195af9e9b5c19fd80018"), "name" : "Sue" } 
{ "_id" : ObjectId("513a1ccaf9e9b5c19fd80019"), "name" : "Eddie" } 

我希望能够为单个结果将返回值优先考虑像这样执行(不区分大小写)查询:
如果“名字“开头,然后返回第一个按字母顺序排列的”开头“结果。
否则,如果名称包含我的字符串,则返回第一个按字母顺序排列的结果。

示例:
搜索/sue/i应返回“Sue”。
搜索/e/i应返回“Eddie”。
搜索/len/i应返回“Ellen”。
搜索/ue/i应返回“Mary Sue”。

是否有可能做到这一点没有任何做2个独立的电话(一个用于/^len/i,然后/len/i,如果我得到0的结果),或发现每场比赛和解析结果自己?

我碰巧在这里使用了node.js和mongoose,但通用的mongo答案也可以,所以我可以理解这些概念。

+0

没有,真的没有,因为我相信你想要的,找到最佳匹配(开始正好与),如果没有最佳匹配,找到“确定”匹配。第二次搜索将非常密集,因为所有名字都需要匹配(而第一次可能会使用索引)。就性能而言,这种类型的搜索可能对全文搜索引擎更好。也许。 :) – WiredPrairie 2013-03-08 19:23:17

+0

对于这个项目我不关心性能。名称的范围足够小,以便进行“全面”搜索,并在客户端以编程方式进行搜索,这很好。但我认为可能会出现某种地图缩减或聚合技巧,或者甚至是我想要做的事情的“名称”。我一般还在学习数据库术语(并从nosql数据库开始,这可能很奇怪......) – Josh 2013-03-08 23:50:39

回答

0

这只是正确的正则表达式的问题。您可以在正则表达式中指定多个匹配项。值得看看http://regex.learncodethehardway.org/book/并深入了解正则表达式。 OR从www.mongodb.org下载2.4,并尝试新的文本索引选项

http://docs.mongodb.org/manual/release-notes/2.4/#text-indexes

+0

我来自perl背景;我对正则表达式非常熟悉。正则表达式本身是微不足道的;我正在寻求将“最佳”匹配作为单一结果,基本上来自findOne()。 我会阅读2.4的功能,看看这些是否会有所帮助,但。 – Josh 2013-03-15 11:56:31