2011-11-22 77 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万个文档的测试,它仍然是瞬间显示的。