MFB*_*MFB 2 python mongodb pymongo aggregation-framework
我目前正在使用Python来构建我的许多结果而不是MongoDB本身.我试图让我的头围绕聚合,但我有点挣扎.这是我目前正在做的一个例子,也许可以由MongoDB更好地处理.
我有一系列节目和一系列剧集.每个程序都有一个与之关联的剧集列表(DBRefs).(剧集存储在他们自己的集合中,因为节目和剧集都非常复杂和深刻,因此嵌入是不切实际的).每集都有一段持续时间(浮动).如果我想找一个节目的平均剧集持续时间,我这样做:
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
Run Code Online (Sandbox Code Playgroud)
当节目有超过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
}
Run Code Online (Sandbox Code Playgroud)
我想通了,与把它全部拉进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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7101 次 |
| 最近记录: |