2011-11-22 5 views
9

私はユーザーのコレクションを持っていて、それらのユーザーのユーザー名にオートコンプリートを実装したいとします。私はmongodbのドキュメントを見て、$ regexはこれを行う方法の1つと思われます。より良い方法がありますか?より良いことは、より良い演技/より良い練習を意味します。MongoDBでオートコンプリートを実装する

答えて

9

@Thiloの提案によれば、プレフィックスを含むいくつかのアイデアを使用できます。

最も重要なことは、(オートコンプリートを感覚で瞬時にしたいので)非常に迅速なリクエストがあることです。したがって、適切なインデックスを使用するクエリを使用する必要があります。

regexpで:/^prefix/を使用してください(重要なのは、クエリ使用インデックスを作成するために必須の行頭を指定する^です)。以下のようなエントリを持つあなたはモンゴに接頭辞木を保存することができます(別名しようとします):

範囲クエリがあまりにも良いです:{ $gt : 'jhc', $lt: 'jhd' } }

より複雑なより高速

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

この最後のソリューションは非常に高速であります(もちろん複雑なインデックスの場合)、スペース効率はまったくありません。あなたはあまりにも選択したトレードオフを知っています。

+0

優れた答えです。試しに完了していたわけではありませんでした。個人的には、モンゴでRegexesを使用することで、私は決して「瞬時に」感じることはありませんでした。これははるかに速くするトリックを行う必要があります! – Vivek

+0

実際、mongoのregexpは実際にはうまく実装されていません。しかし、ライブでデータベースを照会するとは思わない流体が必要な場合は、レイテンシが高すぎます。オートコンプリートを実装する適切な方法は、いくつかの通常の完了を非同期的にロードし、時間(およびユーザ入力)が進むにつれて完了させることです。 – kamaradclimber

2

あなたは接頭辞を探しているなら、あなたは(正確な構文についてはよく分からない)の範囲のクエリを使用することができます。

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

そして、あなたは、ユーザー名のフィールドにインデックスをしたいです。

+0

この例で範囲クエリがどのように機能するか説明できますか?たとえば、コレクションに「cat」がある場合、「ca」は正しい用語をどのように返しますか? – wazzaday

+0

"ca"と "cb"の間のすべてを検索できます。 'ca Thilo

5

私たちは、正規表現を使用してそれを行うと、それは限り、あなたは、インデックスを持っていて、/ ^値/

は、あなたがしたいことがありますので、インデックスと大文字小文字を区別しないオプションを使用することはできませんので注意してください使用して高速です文字列の小文字バージョンをドキュメントの別のフィールドとして保存し、オートコンプリートに使用します。

私は300万件以上のドキュメントを使ってテストを行いましたが、それはまだ瞬時に表示されています。

関連する問題