私は現在、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
}