Python 使用pymongo聚合整个mongodb对象
我有一个包含一些大型对象的数据库,它们的键/结构总是相同的:Python 使用pymongo聚合整个mongodb对象,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一个包含一些大型对象的数据库,它们的键/结构总是相同的: { "stats": { "a": 100 "b": 0 "c": 30 "d": 20 ... "z": 100 } }, { "stats": { "a": 200 "b": 2 "c": 10 "d": 40 ... "z": 100 } } 我想知道是否有一种方法可以聚合所有stats子对象,而不使用PyMongo
{
"stats": {
"a": 100
"b": 0
"c": 30
"d": 20
...
"z": 100
}
},
{
"stats": {
"a": 200
"b": 2
"c": 10
"d": 40
...
"z": 100
}
}
我想知道是否有一种方法可以聚合所有stats
子对象,而不使用PyMongo指定它们的所有字段。所需的输出如下:
"stats": {
"a": 150
"b": 1
"c": 20
"d": 30
...
"z": 100
}
我发现了这个:但我有点不确定如何在PyMongo中使用它
编辑:我可以列出所有字段并将其聚合,但我正在寻找一种不列出这些字段的解决方案(我有大约100个字段)。没有一个内置的方法来满足您的要求,至少我不知道 您可以做的一件事是用Python动态构建管道。因为每个文档都有相同的字段,所以您可以执行
查找一个
,并使用它来获取字段集并从中构建聚合管道
例如:
import pprint
from pymongo import MongoClient
client = MongoClient()
pp = pprint.PrettyPrinter(indent=4)
db = MongoClient().test
collection = db.foo
pipeline = [{
'$group': {
'_id' : None
}
}]
group = pipeline[0]['$group']
doc = collection.find_one()
for k in doc['stats']:
group[k] = {'$avg' : '$stats.'+k}
pp.pprint(pipeline)
cursor = collection.aggregate(pipeline, allowDiskUse=True)
for doc in cursor:
pp.pprint(doc)
输出:
[ { '$group': { '_id': None,
u'a': { '$avg': u'$stats.a'},
u'b': { '$avg': u'$stats.b'},
u'c': { '$avg': u'$stats.c'},
u'd': { '$avg': u'$stats.d'},
u'z': { '$avg': u'$stats.z'}}}]
{ u'_id': None, u'a': 150.0, u'b': 1.0, u'c': 20.0, u'd': 30.0, u'z': 100.0}
我想确认你想得到每个键的平均值,是吗?是的,这正是我想要的,难道没有办法使用map reduce函数吗?我不知道如何编写它,但是这个解决方案是一个很好的开始。您可能可以使用map reduce来实现这一点,但是聚合框架的性能会更好。地图还原应该是最后的手段。