【发布时间】:2012-01-03 15:53:17
【问题描述】:
假设我有一组用户,并希望对这些用户的用户名实施自动完成。我查看了 mongodb 文档,$regex 似乎是一种方法。有没有更好的办法?更好是指更高性能/更好的实践。
【问题讨论】:
标签: ruby-on-rails mongodb autocomplete
假设我有一组用户,并希望对这些用户的用户名实施自动完成。我查看了 mongodb 文档,$regex 似乎是一种方法。有没有更好的办法?更好是指更高性能/更好的实践。
【问题讨论】:
标签: ruby-on-rails mongodb autocomplete
正如@Thilo 所建议的,您可以使用多种想法,包括前缀。
最重要的是有非常快速的请求(因为你希望自动完成感觉瞬间)。所以你必须使用能够正确使用索引的查询。
使用正则表达式:使用/^prefix/(重要的是 ^ 指定行首,这是使查询使用索引所必需的)。
范围查询也不错:{ $gt : 'jhc', $lt: 'jhd' } }
更复杂但更快:您可以将前缀树存储在 mongo(又名尝试)中,条目如下:
{usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]}
{usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]}
最后一个解决方案非常快(当然,如果索引在 compl 上),但根本不节省空间。您知道自己也可以选择权衡取舍。
【讨论】:
我们使用正则表达式,只要您有索引并且使用 /^value/,它就会很快
请注意,您不能对索引使用不区分大小写的选项,因此您可能希望将字符串的小写版本存储为文档中的另一个字段,并将其用于自动完成。
我已经对超过 300 万份文档进行了测试,但它仍然是即时的。
【讨论】:
如果您正在寻找前缀,您可以使用范围查询(不确定确切的语法):
db.users.find({'username': { $gt : 'jhc', $lt: 'jhd' } } )
你想要一个用户名字段的索引。
【讨论】:
ca < cats < cb