2

私は現在、MongoDB自体ではなく、Pythonを使用して結果の多くを構築しています。Aggregationに頭を悩ませようとしていますが、少し苦労しています。これは私が現在行っていることの例であり、おそらく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シェル形式のサンプルデータです。同じプログラムに属する3つのエピソードがあります。プログラムの平均エピソード期間を計算するにはどうすればよいですか?

> 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
}
4

1 に答える 1

6

私はそれを理解しました、そしてそれはそれをすべて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']
于 2012-10-29T23:39:12.377 に答える