Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 在本例中如何使用Mongodb聚合?_Python_Mongodb_Pymongo_Aggregation Framework - Fatal编程技术网

Python 在本例中如何使用Mongodb聚合?

Python 在本例中如何使用Mongodb聚合?,python,mongodb,pymongo,aggregation-framework,Python,Mongodb,Pymongo,Aggregation Framework,我目前正在使用Python来构建我的许多结果,而不是MongoDB本身。我正试着让我的头脑清醒过来,但我有点挣扎。下面是我目前正在做的一个示例,MongoDB可能会更好地处理这个示例 我有一套节目集和一套剧集。每个节目都有一个与之关联的剧集列表(DBREF)。(因为节目和剧集都非常复杂和深入,所以嵌入是不切实际的,所以剧集存储在它们自己的集合中)。每一集都有一个持续时间(浮动)。如果我想找到一个节目的平均持续时间,我会这样做: episodes = list(db.Episodes.find({

我目前正在使用Python来构建我的许多结果,而不是MongoDB本身。我正试着让我的头脑清醒过来,但我有点挣扎。下面是我目前正在做的一个示例,MongoDB可能会更好地处理这个示例

我有一套节目集和一套剧集。每个节目都有一个与之关联的剧集列表(DBREF)。(因为节目和剧集都非常复杂和深入,所以嵌入是不切实际的,所以剧集存储在它们自己的集合中)。每一集都有一个持续时间(浮动)。如果我想找到一个节目的平均持续时间,我会这样做:

episodes = list(db.Episodes.find({'Program':DBRef('Programs',ObjectId(...))}))
durations = set(e['Duration'] for e in episodes if e['Duration'] > 0)
avg_mins = int(sum(durations) / len(durations) / 60
当一个节目有超过1000集时,这是相当慢的。有没有办法在MongoDB中实现这一点

以下是Mongo shell格式的一些示例数据。同一个节目有三集。如何计算节目的平均持续时间

> db.Episodes.find({
    '_Program':DBRef('Programs',ObjectId('4ec634fbf4c4005664000313'))},
   {'_Program':1,'Duration':1}).limit(3)

{
    "_id" : ObjectId("506c15cbf4c4005f9c40f830"),
    "Duration" : 1643.856,
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313"))
}
{
    "_id" : ObjectId("506c15d3f4c4005f9c40f8cf"),
    "Duration" : 1598.088,
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313"))
}
{
    "_id" : ObjectId("506c15caf4c4005f9c40f80e"),
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313")),
    "Duration" : 1667.04
}

我发现了它,与将其全部拉入Python相比,它的速度快得离谱

p = db.Programs.find_one({'Title':'...'})

pipe = [
        {'$match':{'_Program':DBRef('Programs',p['_id']),'Duration':{'$gt':0}}},
        {'$group':{'_id':'$_Program', 'AverageDuration':{'$avg':'$Duration'}}}
        ]

eps = db.Episodes.aggregate(pipeline=pipe)

print eps['result']

您是如何尝试使用聚合框架实现的?看起来您想按programId对剧集进行分组,并首先查找平均持续时间仅匹配持续时间>0的剧集?我认为您是对的,但我不太理解语法。你能给我解释一下吗?你能给我一个shell格式的DB样本和想要的输出吗?“也许有人能帮你整理一个AF查询。”cirrus提出了一个很好的建议。我已经做到了。当我尝试做类似的事情时,我得到了以下错误:aggregate()为关键字参数“pipeline”的任何指针获取了多个值??