Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pymongo聚合整个mongodb对象_Python_Mongodb_Pymongo - Fatal编程技术网

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来实现这一点,但是聚合框架的性能会更好。地图还原应该是最后的手段。