即将推出的MongoDB 2.4支持full-text search。
我们使用命令(例如
)在mongo shell中执行此操作db.players.runCommand("text", {
"search": "alice",
"project": {"name": 1, "_id": 0},
"limit": 10})
现在将此移植到pymongo时,我们必须处理pymongo runCommand
类中未定义Collection
的事实。我能够弄清楚真正的命令是什么,所以这在shell中起作用:
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})
当然失败了:“没有这样的cmd:项目”。
如果我只使用search
和limit
,我可以让事情发挥作用,例如
db.command({
"text": "players",
"search": "alice",
"limit": 10})
但我想将filter
和project
与pymongo一起使用。有没有人使用项目和过滤器进行全文搜索?
除此之外:也许有一种很好的方法可以从shell命令推断出pymongo命令的形状?
答案 0 :(得分:12)
想出来:pymongo使用关键字参数作为附加命令参数:
db.command("text", "players",
search="alice",
project={"name": 1, "_id": 0},
limit=10)
奇怪的错误消息“没有这样的cmd:project”的原因是Python的字典是无序的,project
密钥在传递给mongo时恰好是第一个。
答案 1 :(得分:0)
另一种解决方案是使用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)