python - 使用 pymongo 3.0 从 mongo 聚合中获取结果

标签 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

但这样做只会让我出现以下错误:

Traceback (most recent call last):  
File "query2.py", line 195, in <module>  
pprint( list(query2('Catalonia', 1, 1)) )  
File "query2.py", line 72, in query2

if len(subquery['result']) > 0 :  
TypeError: 'CommandCursor' object is not subscriptable

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

我正在使用 Python 3.4.3 和 pymongo 3.0.1。

最佳答案

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)

关于python - 使用 pymongo 3.0 从 mongo 聚合中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29942359/

相关文章:

python - 如何使用列表理解将 If 和 Else 的值添加到两个不同的列表中?

javascript - Mongodb,按 datediff 分组并获取小时数

node.js - 如何使用node js从mongo获取记录中的特定信息?

javascript - 如何在 MongoDB 中使用集合?

database - MongoDB 按年份查找查询

python - ROC AUC 值为 0

python - Kivy:使用 ListAdapter 或 DictAdapter 更新 ListView 数据不会更改按钮文本

python - 使用fineuploader和django将文件上传到S3时出现签名错误消息

javascript - 更改 JSON 文档的键

node.js - Mongoose 中的模式关联