0

今月のデータの合計を取得する MongoDB 集計クエリを作成しましたが、これを変更して、月の各日から各日の合計を含む配列を返すようにするにはどうすればよいでしょうか (私は、これは可能ですが、機能させるのは難しいと思います)?これが不可能な場合、ループを使用して 30 個のグループ クエリを実行するよりも良い方法はありますか?

私はPHPドライバーを使用していますが、シェルでの回答も同様に便利です。

$total_this_month = $db->test->group(
    array(  ),
    array(
        'sum' => 0
    ),
    new MongoCode( 'function(doc, out){ out.sum += doc.data; }' ),
    array(
        'condition' => array(
            'time' => array(
                '$gte' => new MongoDate(strtotime('first day of this month, 00:00:00')),
                '$lte' => new MongoDate(strtotime('last day of this month, 23:59:59'))
            )
        )
    )
);
4

2 に答える 2

1

グループクエリを頻繁に実行することを計画している場合は、必要な期間でグループ化できる新しいフィールドを追加することを検討する必要があります。map-reduceを使用するという以前の答えは、これがパフォーマンスの調整を必要としないアドホッククエリである場合に最適です。たとえば、日、週、月などで集計する必要のあるコレクションがあります。レコードの例を次に示します。

{"_id" : ObjectId("4ddaed3a8b0f766963000003"),
 "name": "Sample Data",
 "time" : "Mon May 23 2011 17:26:50 GMT-0600 (MDT)",
 "period" : {
   "m" : 201105,
   "w" : 201121,
   "d" : 20110523,
   "h" : 2011052317
 }
}

これらの追加フィールドを使用すると、グループ関数を使用してさらに多くのことを実行でき、クエリを高速化するためにこれらのフィールドにインデックスを付けることもできます。私が行ったように整数を使用するか、文字列を使用するかを選択できます。どちらの方法でも機能しますが、クエリパラメータは同じデータ型である必要があることに注意してください。私は整数が好きです。整数の方が少しパフォーマンスが良く、使用するスペースも少ないはずだからです(ただの予感)。

于 2011-06-24T18:06:26.577 に答える
0

groupコマンドは、関数を介した新しいグループ化キーの生成をサポートしていないため、groupの代わりにmap/reduceを使用してください。

于 2011-06-24T15:49:26.150 に答える