使用pymongo 3.0获取mongo聚合的结果

时间:2015-04-29 11:28:19

标签: python mongodb mongodb-query aggregation-framework

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

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

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

[{'_id': 0, 'minim': 10}]

我现在要做的是从此聚合中获取minim值。

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

if len(subselect['result']) > 0 :
   minim = subquery['result'][0]['minim']
else: return subselect

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

  

追踪(最近的呼叫最后):
       文件“query2.py”,第195行,中        pprint(list(query2('Catalonia',1,1)))
       在query2

中输入第72行的“query2.py”      

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

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

我正在使用Python 3.4.3和pymongo 3.0.1。

2 个答案:

答案 0 :(得分:9)

Pymongo 3.0.1返回aggregation results as cursor,这意味着您无法使用subquery['result']访问结果。要禁用游标并强制pymongo返回带有{'result':{...}}而不是游标的文档,请使用:

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

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

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

答案 1 :(得分:0)

由于useCursor已被弃用,并将在PyMongo 4.0中删除,因此建议对结果进行迭代:

subquery = db.partsupp.aggregate([
    {"$match": {"r_name": region }},
        {"$group": {
            "_id" : 0,
            "minim": {"$min": "$supplycost"}
            }
        }
])
results = [doc for doc in subquery]