使用pymongo 3.0从mongo聚合获得结果

Alb*_*ats 3 python mongodb mongodb-query aggregation-framework

我正在使用python来查询mongo集合并从中检索一个值:

subquery = db.partsupp.aggregate([
    {"$match": {"r_name": region }},
        {"$group": {
            "_id" : 0,
            "minim": {"$min": "$supplycost"}
            }
        }
])
Run Code Online (Sandbox Code Playgroud)

此查询工作正常,它输出:

[{'_id': 0, 'minim': 10}]
Run Code Online (Sandbox Code Playgroud)

我现在要做的是minim从这个聚合中获取值.

最初我想要的是'if'来检查查询是否有任何结果,如下所示:

if len(subselect['result']) > 0 :
   minim = subquery['result'][0]['minim']
else: return subselect
Run Code Online (Sandbox Code Playgroud)

但这样做只会给我带来以下错误:

回溯(最近一次调用最后一次):
文件"query2.py",第195行,在
pprint中(list(query2('Catalonia',1,1)))
文件"query2.py",第72行,在query2中

if len(subquery ['result'])> 0:
TypeError:'CommandCursor'对象不可订阅

看起来subselect查询的结果不可迭代或类似的东西,我该如何解决?

我使用的是Python 3.4.3和pymongo 3.0.1.

anh*_*hlc 9

Pymongo 3.0.1将聚合结果作为游标返回,这意味着您无法访问结果subquery['result'].要禁用游标并强制pymongo返回文档{'result':{...}}而不是游标,请使用以下命令:

subquery = db.partsupp.aggregate([
    {"$match": {"r_name": region }},
        {"$group": {
            "_id" : 0,
            "minim": {"$min": "$supplycost"}
            }
        }
], useCursor=False)
Run Code Online (Sandbox Code Playgroud)

从pymongo 4.0开始,useCursor不再可用,使用list()将游标转换为列表:

cursor = db.partsupp.aggregate([
    {"$match": {"r_name": region }},
        {"$group": {
            "_id" : 0,
            "minim": {"$min": "$supplycost"}
            }
        }
])
subquery['result'] = list(cursor)
Run Code Online (Sandbox Code Playgroud)