使用 pymongo 3.0 从 mongo 聚合中获取结果
Get result from mongo aggregation using pymongo 3.0
我正在使用 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 returns aggregation results as cursor,这意味着您无法使用 subquery['result']
访问结果。要禁用游标并强制 pymongo return 使用 {'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)
由于 useCursor 已弃用并将在 PyMongo 4.0 中删除,我建议迭代结果:
subquery = db.partsupp.aggregate([
{"$match": {"r_name": region }},
{"$group": {
"_id" : 0,
"minim": {"$min": "$supplycost"}
}
}
])
results = [doc for doc in subquery]
我正在使用 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 returns aggregation results as cursor,这意味着您无法使用 subquery['result']
访问结果。要禁用游标并强制 pymongo return 使用 {'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)
由于 useCursor 已弃用并将在 PyMongo 4.0 中删除,我建议迭代结果:
subquery = db.partsupp.aggregate([
{"$match": {"r_name": region }},
{"$group": {
"_id" : 0,
"minim": {"$min": "$supplycost"}
}
}
])
results = [doc for doc in subquery]