14

即将推出的 MongoDB 2.4 支持全文搜索

我们在 mongo shell 中使用命令执行此操作,例如

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

现在,当将其移植到 pymongo 时,我们必须处理runCommand未在 pymongoCollection类上定义的事实。我能够弄清楚真正的命令是什么,所以这在 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:项目”。

如果我只使用searchand limit,我可以让事情正常工作,例如

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

但我想使用filterprojectpymongo。有没有人使用项目和过滤器进行全文搜索?

旁白:也许有一种从 shell 命令推断 pymongo 命令形状的好方法?

4

2 回答 2

12

想通了:pymongo 使用关键字参数作为附加命令参数:

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

奇怪的错误消息“no such cmd: project”的原因是 Python 的字典是无序的,并且projectkey 在传递给 mongo 时恰好是第一个。

于 2013-03-09T08:02:06.480 回答
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)
于 2014-09-26T22:47:10.043 回答