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

2024-05-23 13:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用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
}

Tags: iddbmongodbprogram节目例子持续时间duration
1条回答
网友
1楼 · 发布于 2024-05-23 13:33:20

我想出来了,和把它全部放到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']

相关问题 更多 >