2013-07-06 114 views
20

我想找到名稱的帳戶(以50K賬戶MongoDB的集合)MongoDB中,對索引字段

在通常的方式查詢的執行正則表達式:我們用繩子

找到
db.accounts.find({ name: 'Jon Skeet' }) // indexes help improve performance! 

如何用正則表達式?這是一項昂貴的手術嗎?

db.accounts.find({ name: /Jon Skeet/ }) // worry! how indexes work with regex? 

編輯:

根據WiredPrairie:
MongoDB的使用前綴正則表達式來查找的索引(例如:/^prefix.*/):

db.accounts.find({ name: /^Jon Skeet/ }) // indexes will help!' 

MongoDB $regex

+6

@dirkk,我想得到更多的經驗和解釋。我也想分享這個問題。 – damphat

+2

對於使用索引的正則表達式,它必須使用錨點,如文檔中所示:http://docs.mongodb.org/manual/reference/operator/regex/ – WiredPrairie

+0

可能的重複[如何用「like」查詢mongodb) ?](http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like) – WiredPrairie

回答

20

實際上根據文檔,

如果索引存在用於字段,然後匹配的MongoDB針對在索引中的值,其可以比 集合掃描更快的正則表達式 。如果常規 表達式是「前綴表達式」,則表示所有可能的 匹配都以相同的字符串開頭,因此可能會發生進一步的優化。這允許MongoDB根據該前綴構造一個「範圍」 ,並且只與來自該範圍內的 索引中的值匹配。

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

換句話說:

對於/喬恩斯基特/正則表達式,蒙戈將全掃描索引鍵,然後將獲取匹配的文檔,它可以比採集掃描速度更快。

對於/^Jon Skeet/regex,mongo將只掃描索引中以regex開頭的範圍,速度會更快。

+1

正則表達式工作正常,如果有立即匹配(即:匹配字母'a')。但是,如果我匹配一個完整的單詞結果需要更長的時間(即:'角度')。這是跨越6M的文件,無論如何加快這些查詢?他們需要19到30秒的時間來處理8個以上的字符,但會立即返回1-2個字符。 – chovy

+0

@chovy,我相信MongoDB並不是在文本中間搜索字符串的最佳工具 - 我建議查看ElasticSearch或任何其他全文搜索引擎。 – heroin

相關問題