【问题标题】:How can I use Mongodb Aggregation in this example?在此示例中如何使用 Mongodb 聚合?
【发布时间】:2012-10-18 10:18:18
【问题描述】:

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

当一个节目超过 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
}

【问题讨论】:

  • 你是如何尝试使用聚合框架的?看起来您想按 programId 对剧集进行分组,并首先找到仅匹配持续时间 > 0 的平均持续时间?
  • 我认为你是对的,但我并不真正理解语法。愿意为我拼出来吗?
  • 你能以 shell 格式展示你的数据库样本和所需的输出吗?有人可能会帮助您整理 AF 查询。
  • @cirrus 很好的建议。我已经做到了。

标签: python mongodb pymongo aggregation-framework


【解决方案1】:

我想通了,与将其全部放入 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']

【讨论】:

  • 当我尝试做类似的事情时,我得到以下错误:aggregate() got multiple values for keyword argument 'pipeline' Any pointers ??
猜你喜欢
  • 2020-06-08
  • 2021-09-27
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多