如何在spring中在mongo模板中编写此聚合查询

时间:2016-11-01 13:07:36

标签: java spring aggregation-framework mongotemplate

我想使用spring在mongo模板中编写这个聚合查询。

这是我的疑问:

db.getCollection('CANdata_fc_distance_report').aggregate(
    {$match: { device_datetime : { $gte :1462041000000, $lte: 1462732200000 }}},
    {"$group" : {_id:{fc :"$fc",vehicle_name:"$vehicle_name",
        device_id : "$device_id"},
    count:{$sum:1}}}
)

这是上述查询的结果

/* 1 */
{
    "_id" : {
        "fc" : NumberLong(1),
        "vehicle_name" : "WPD 9020",
        "device_id" : NumberLong(157)
    },
    "count" : 2
}    
/* 2 */
{
    "_id" : {
        "fc" : NumberLong(2),
        "vehicle_name" : "VVD 8966",
        "device_id" : NumberLong(137)
    },
    "count" : 1
}

这是我在表格中的数据:

/* 1 */
{
    "_id" : ObjectId("581829855d08921ee6f0ac39"),
    "_class" : "com.analysis.model.mongo.fc_distance_report",
    "device_id" : NumberLong(137),
    "vehicle_name" : "VVD 8966",
    "distance" : 125.01,
    "fc" : NumberLong(1),
    "device_datetime" : NumberLong(1462041000000)
}

/* 2 */
{
    "_id" : ObjectId("581830335d08921ee6f0ad6b"),
    "_class" : "com.analysis.model.mongo.fc_distance_report",
    "device_id" : NumberLong(137),
    "vehicle_name" : "VVD 8966",
    "distance" : 171.88,
    "fc" : NumberLong(2),
    "device_datetime" : NumberLong(1462127400000)
}

我在google搜索中找到了添加匹配条件的示例,但我不知道如何在3列上编写分组

Aggregation agg = newAggregation(match(Criteria.where("device_datetime").exists(true)
                            .andOperator(
    Criteria.where("device_datetime").gte(startDate),
    Criteria.where("device_datetime").lte(endDate))),
    group("hosting").count().as("total"),
    project("total").and("hosting").previousOperation(),
    sort(Sort.Direction.DESC, "total")
    );

请帮帮我。谢谢

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。只是和组键在一起。

Aggregation agg = newAggregation(match(Criteria.where("device_datetime").exists(true)
        .andOperator(
            Criteria.where("device_datetime").gte(startDate),
            Criteria.where("device_datetime").lte(endDate))),
    group(Fields.fields().and("fc", "$fc").and("vehicle_name", "$vehicle_name").and("device_id", "$device_id"))
    .count().as("count"));