2011-11-22 55 views
9

假設我有一組用戶並希望對這些用戶的用戶名實現自動填充。我看了一下mongodb文檔,$ regex似乎是這樣做的一種方法。有沒有更好的辦法?更好的意思是更高效/更好的實踐。在MongoDB上實現自動完成

回答

9

正如@Thilo建議的那樣,您可以使用幾個想法,包括前綴。

最重要的是要有非常快速的請求(因爲你想自動完成到感覺 instaneous)。所以你必須使用正確使用索引的查詢。

使用正則表達式:使用/^prefix/(重要的是^指定使查詢使用索引必需的行的開頭)。

範圍查詢是太好:{ $gt : 'jhc', $lt: 'jhd' } }

更復雜,但速度更快:你可以存儲在蒙戈與像輸入前綴樹(又名嘗試):

{usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]} 
{usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]} 

這最後的解決方案是非常快(當然,如果是compl的索引),但根本沒有空間效率。你知道你選擇的權衡。

+0

優秀的答案。雖然沒有完成嘗試。就我個人而言,我從來沒有在Mongo中使用Regexes的「瞬間」感覺。這應該做的訣竅,使其更快! – Vivek

+0

事實上,mongo中的正則表達式並沒有很好地實現。然而,當你想要流暢的東西時,你不會想要在實時查詢數據庫,延遲太高。實現自動完成的正確方法是異步加載一些通常的完成,並隨着時間(和用戶輸入)的完成而完成。 – kamaradclimber

2

如果您正在尋找的前綴,你可以使用一個範圍查詢(不知道確切的語法):

db.users.find({'username': { $gt : 'jhc', $lt: 'jhd' } }) 

而你要在用戶名字段的索引。

+0

你能解釋範圍查詢在這個例子中的工作原理嗎?例如,如果我的藏品中有「貓」,那麼「ca」會如何返回正確的術語。 – wazzaday

+0

您可以搜索「ca」和「cb」之間的所有內容。 'ca Thilo

5

我們確實使用正則表達式它和它的快,只要你有一個索引,並使用/ ^值/

要知道,你不能與索引使用不區分大小寫的選項,所以你可能要將字符串的小寫字母存儲爲文檔中的另一個字段,並將其用於自動填充。

我已經完成了300萬個文檔的測試,它仍然是瞬間顯示的。