Можно ли использовать метод "find" с запросом "javascript" с pymongo? - PullRequest
3 голосов
/ 09 февраля 2012

С Mongo все в порядке со следующим:

> db.posts.find("this.text.indexOf('Hello') > 0")

Но с pymongo, при выполнении следующего:

for post in db.posts.find("this.text.indexOf('Hello') > 0"):
    print post['text']

произошла ошибка.

Я думаю, Полнотекстовый поиск в Mongo - лучший способ в этом примере, но возможно ли использовать метод "find" с запросом "javascript" с pymongo?

1 Ответ

6 голосов
/ 09 февраля 2012

Вы правы - вы делаете это с помощью javascript на стороне сервера, используя условие $ where [1]:

db.posts.find({"$where": "this.text.indexOf('Hello') > 0"})

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

Вы также можете выполнить поиск по регулярному выражению:

db.posts.find({'text':{'$regex':'Hello'}})

Это также выполнит полное сканирование коллекции, поскольку регулярное выражение не привязано (например, если вы привязываете регулярное выражение, например, вы проверяете, начинается ли поле со значения , а имеет индекс на это поле вы можете использовать индекс).

Учитывая, что эти два подхода дороги и не будут работать или масштабироваться лучше, чем лучший подход?

Хорошо, подход полнотекстового поиска, как описано в ссылке, которую вы дали [2], работает хорошо. Создайте поле _keywords, которое хранит ключевые слова в нижнем регистре в массиве, индексируйте это поле, а затем выполните запрос следующим образом:

db.posts.find({"_keywords": {"$in": "hello"});

Это будет масштабировать и использовать индекс, поэтому будет производительным.


[1] http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

[2] http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo

...