質問

私は、Webサービスからのいくつかの統計を収集し、収集に格納しています。データはこれに似ています(しかし、より多くのフィールドを持つ):

{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"}
{…}
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"}
誰かが最後の30日間毎日数字を要求した場合、

は、それは「ダウンロード」PR(この例では)の最大量を意味します。日。これはその日の最後のレコードである。

collection.find({"dt": {"$gt": datetime_obj_30_days_ago}})を使用することにより、私は、もちろん非常に適していないすべての行を取得します。私は道を探していますので、一定期間だけのために一日の最後を返します。

私はgroup()が移動するための方法かもしれないと言われましたが、私はかなりそれは、このインスタンスでの作業を取得する方法を理解することはできません。

任意のヒント、ポインタが非常に高く評価されるだろう!

役に立ちましたか?

解決

あなたは、この使用してグループを行うことができます。あなたは日時フィールドの日付のみのコンポーネントをしたいので、あなたの例では、キーを計算する(同様の機能を減らす)ためにJavaScript関数を供給する必要があると思います。この作業をする必要があります:

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }',
    condition={'dt': {'$gt': datetime_obj_30_days_ago}},
    initial={'downloads': 0},
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }'
)
だけではなく、クライアントのサーバー上で、やはり過去月のリニアスキャンを行うことに注意してください。それは単に個別に、毎日の最大値を選択すると、高速です。のこと。

可能のです
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top