问题 在Pymongo的全文搜索


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

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

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

现在把它移植到pymongo时,我们必须处理这个事实 runCommand 没有在pymongo上定义 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命令的形状?


2714
2018-03-06 20:17


起源



答案:


弄清楚:pymongo使用关键字参数作为附加命令参数:

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

奇怪的错误消息“没有这样的cmd:项目”的原因是Python的字典是无序的,并且 project 传递给mongo时,关键恰好是第一个。


11
2018-03-09 08:02



这对正则表达式也有用吗?像db.command(“regex”,“players”,search =“alice”) - Jeff
我不熟悉 regex 命令。它没有出现 正式的命令列表 来自MongoDB。 - Ray Toal


答案:


弄清楚:pymongo使用关键字参数作为附加命令参数:

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

奇怪的错误消息“没有这样的cmd:项目”的原因是Python的字典是无序的,并且 project 传递给mongo时,关键恰好是第一个。


11
2018-03-09 08:02



这对正则表达式也有用吗?像db.command(“regex”,“players”,search =“alice”) - Jeff
我不熟悉 regex 命令。它没有出现 正式的命令列表 来自MongoDB。 - Ray Toal


另一种解决方案是使用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)

0
2017-09-26 22:47