Реализовать автозаполнение на MongoDB - PullRequest
11 голосов
/ 22 ноября 2011

Скажем, у меня есть коллекция пользователей, и я хочу реализовать автозаполнение имен пользователей этих пользователей.Я посмотрел на документы mongodb, и $ regex, кажется, является одним из способов сделать это.Есть ли способ лучше?Под лучшим я подразумеваю больше производительности / лучшей практики.

Ответы [ 3 ]

11 голосов
/ 22 ноября 2011

Как предлагает @Thilo, вы можете использовать несколько идей, включая префикс.

Самое главное, чтобы у вас был очень быстрый запрос (потому что вы хотите, чтобы автозаполнение до казалось мгновенным). Таким образом, вы должны использовать запрос, который будет правильно использовать индексы.

При использовании regexp: используйте /^prefix/ (важно, чтобы ^ указывал начало строки, которая обязательна для индекса использования запроса).

Запрос диапазона также хорош: { $gt : 'jhc', $lt: 'jhd' } }

Сложнее, но быстрее: вы можете хранить префикс-деревья в монго (он же пытается) с такими записями, как:

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

Это последнее решение очень быстрое (если, конечно, индексы на compl), но совсем не экономит место. Вы знаете компромисс, который вы тоже выбрали.

7 голосов
/ 23 ноября 2011

Мы делаем это с помощью регулярных выражений, и это быстро, если у вас есть индекс и вы используете / ^ value /

Имейте в виду, что нельзя использовать параметр без учета регистра с индексом, поэтому вы можете сохранить строчную версию вашей строки в качестве другого поля в документе и использовать ее для автозаполнения.

Я провел тесты с более чем 3 миллионами документов, и они все еще отображаются мгновенно.

3 голосов
/ 22 ноября 2011

Если вы ищете префиксы, вы можете использовать запрос диапазона (не уверен в точном синтаксисе):

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

И вам нужен индекс для поля имени пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...