2013-03-06 108 views
11

即將推出的MongoDB 2.4支持full-text searchPymongo全文搜索

我們這樣做是在命令蒙戈外殼,如

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}) 

其工作。但是這並不完全告訴我如何讓它在pymongo中工作。我試過:

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}) 

哪一個當然會失敗:「no such cmd:project」。

我可以得到,如果我只用searchlimit,例如

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

,但我想用filterproject與pymongo東西的工作。有沒有人得到全文搜索與項目和過濾器工作?

另外:也許有一個很好的方法來從shell命令推斷pymongo命令的形狀?

回答

11

想通了:pymongo使用關鍵字參數的附加命令參數:

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

的原因奇怪的錯誤消息「沒有這樣的CMD:項目」是Python的字典是無序的,而project關鍵當傳遞給mongo時恰好是第一個。

+0

這是否工作正則表達式呢?像db.command(「regex」,「players」,search =「alice」) – Jeff 2014-03-16 02:46:10

+0

我不熟悉'regex'命令。它沒有出現在MongoDB的[官方命令列表](http://docs.mongodb.org/manual/reference/command/)上。 – 2014-03-16 05:12:13

0

另一種解決方案是使用OrderedDict。假設採集和查詢給定爲變量,而其他參數如限制,投影等人在字典「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)