2013-03-08 15 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