Полнотекстовый поиск по Pymongo

Предстоящий MongoDB 2.4 поддерживает полнотекстовый поиск.

Мы делаем это в оболочке mongo с помощью команды, например

db.players.runCommand("text", {
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit": 10})

Теперь, перенося это на pymongo, мы должны иметь дело с тем, что runCommand не определен в классе pymongo Collection. Мне удалось выяснить, что такое настоящая команда, поэтому это работало в оболочке:

db.runCommand({
    "text": "players", 
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit": 10})

который работал. Но это точно не говорит мне, как заставить это работать на пимонго. Я пробовал:

db.command({
    "text":"players", 
    "pipeline": [
        ("search","alice"), ("project",{"name":1,"_id":0}), ("limit",10)
    ]})

который не работал (он сказал, что "поиск не указан" ). Я также пробовал:

db.command({
    "text": "players", 
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit":10})

который, конечно же, терпит неудачу: "нет такого cmd: project".

Я могу заставить работать, если я использую только search и limit, например

db.command({
    "text": "players", 
    "search": "alice",
    "limit": 10})

но я хотел бы использовать filter и project с pymongo. Кто-нибудь получил полнотекстовый поиск, работающий с проектом и фильтром?

Помимо этого: Может быть, есть хороший способ вывести форму команды pymongo из команды оболочки?

Ответ 1

Выяснилось: pymongo использует аргументы ключевого слова для дополнительных аргументов команды:

db.command("text", "players", 
    search="alice", 
    project={"name": 1, "_id": 0}, 
    limit=10)

Причиной нечетного сообщения об ошибке "no такой cmd: project" является то, что словари Python неупорядочены, а ключ project оказался первым при передаче в mongo.

Ответ 2

Альтернативным решением является использование OrderedDict. Предполагая, что сбор и запрос заданы как переменные, в то время как дополнительные параметры, такие как предел, проекция и другие данные в dict 'params':

params_ord = OrderedDict()
params_ord['text'] = collection
params_ord['search'] = query
for k,v in params.iteritems():
    params_ord[k] = v
db.command(params_ord)