3

mongoDB に基づいてアプリケーションを構築しようとしていますが、1 つのユースケースで行き詰っています。特定の日付範囲間のドキュメントの合計を見つけたい。以下は私のサンプルコレクションです。

db.matrix.findOne()

{
    "_id": "varun_2013-06-06",
    "loginId": "varun",
    "date": ISODate("2013-06-05T18:30:00Z"),
    "headers": [{
            "header": "header1"
            "time": 2,
            "detail": "x"
        }, {
            "header": header2 "time": 4,
            "detail": "y"
        }, {
            "header": "header3"
            "time": 6,
            "detail": "z"
        }, {
            "header": "header4",
            "time": 9,
            "detail": "a"
        }
    ]
}

したがって、特定の範囲について、クエリは各ヘッダーの合計を与える必要があります。fromDate から toDate へ header1 = 40hr header2 = 60hr など....

mongodbでこのユースケースのクエリを見つけるのを手伝ってくれる人はいますか? 春にmongoTemplateを使用しています。そして内部のメインクラス{ "header" : "header1" "time" : 2, "detail" : "x" }ですList<T>

4

1 に答える 1

0

必要な集計パイプラインは次のようなものです。

var startDate = new ISODate(...);
var endDate = new ISODate(...);

col.aggregate([  
  // filter by date range
  { $match: { date: { $gte: startDate, $lte: endDate } },

  // unwind embedded headers collection so we have one item per header
  { $unwind: '$headers' },

  // group by header and output a total
  { $group: { _id: '$headers.header', total: { sum: 1 } }
]);

Spring でこれを行う方法はわかりませんが、Spring が Aggregation Framework をサポートしていると仮定すると、ほとんど同じはずです。

また、データ量が多い場合は、これをサポートするための適切なインデックスが必要になることにも注意してください (たとえば、dateまたはdate+のインデックスheaders.header)。

于 2014-01-27T18:10:08.040 に答える