私はMongoDBの初心者ですが、私が読んだところでは、MongoDBデータベースの平均値と合計値を求めるさまざまな方法があり、それぞれにさまざまな利点と欠点があります。MongoDBの 'AVG'と 'SUM'の機能は、どんなヒントですか?
私は、効率的(高速)な方法で、値の選択の合計と値の選択の平均を見つける方法を主に求めています。照会されているコレクション内の
文書は(他の多くの分野で)このような構造に似ている:、
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
があり、私のアプリケーションでは、常に可能ではないの合計のようなものを事前計算値の選択に理由(日付範囲に基づいて、例えば、開始日と終了日の間に、平均が何か)を変更することができる。これは、平均を事前に計算する際の同様の問題です。
私が読んだところでは、MapReduceはリアルタイム(オンデマンド)検索には理想的ではないため、これも問題にはなりません。 (注意:これはpymongo
を使用している)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
を次に応答上for
ループを使用してPythonで計算をしている私は、このようにコレクションを照会しています現時点では
。 500の結果の限界は、それが遅すぎるのを避けるために任意です。私は値を取得するだけで、他のフィールドは取得しません。
これは、この計算を行う最も効率的な方法ですか、必要なものを達成するための他の方法がありますか?
警告:私はおそらくシャーディングを使用するので、私はそれが使用される機能ですので、私はMapReduceのを使用することはできません
group
機能を使用することはできません
- -the-flyユーザー
- 合計/平均値の選択がほとんど常に異なるため、私は多くの私の合計/平均をあらかじめ計算することはできません
- 私はtryoverflowとWebを試してみました。この種のものを行う方法についての勧告を見つけて、それはかなりオープンエンドだ
EDIT:
私は、文書の数は、私は何もすることができ、上記掲載のクエリから返されたことを指摘しなければならない1文書から数百になるかもしれませんが、返される文書の最大数は約150(平均約60または70)です。
の問題を参照してください.MapReduceでもっと実験しています。私はそれがデータセット/クエリ/などの間で異なることを知っていますが、あなたのケースでは、実際にはユーザーに気付かれないほど速かったです(つまり、半秒以下)。 – johneth
500-5000msの間で変化しますが、一部のデータセットはかなり大きかった(100M +ドキュメント)ので、ビジー/進捗インジケータが必要でしたが、十分に速いです。 JavaScriptエンジンをシングルスレッドのSpiderMonkeyからV8にアップグレードすると、Map-Reduceのパフォーマンスが向上するはずです。 –
ああ、それは有望だと思います。現時点では、データセットは非常に小さく(数千万ではなく数百万で測定されます)、時間が経つにつれて大きくなります。 – johneth