如何使用 spring 数据 mongodb 获取字段子字符串的聚合结果

How to get aggregated result on substring of a field using spring data mongodb

我们有这个数据:

{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceeb"), "geoHash" : "dr72zc5v7440", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceec"), "geoHash" : "dr7965kev5r7", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceed"), "geoHash" : "dr79umt6rksy", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceee"), "geoHash" : "dr7dqxy2cw43", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceef"), "geoHash" : "dr7g0czp7xrt", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef0"), "geoHash" : "dr7gehpyjbv0", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef1"), "geoHash" : "dr7ujw2u8447", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef2"), "geoHash" : "dr7uzb9e45ry", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef3"), "geoHash" : "drkj64f3skv6", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef4"), "geoHash" : "drkjum50nw4t", "customerId" : "abcd" }

Mongo 数据库查询:

db.test.aggregate([{ $match : { "customerId" : "abcd" } }, { "$group": {          "_id": {$substr:["$geoHash",0,4]},count: { $sum: 1 }         }} ])

如何将此查询转换为 Spring mongo java 代码?以下无效:

AggregationOperation group = Aggregation.group("geoHash")
                .first(StringOperators.Substr.valueOf("geoHash").substring(0, 4))
                .as("geoHash")
                .count().as("geoHashCount");

使用Spring Data MongoDB获得你想要的东西的一种方法是先使用ProjectOperation,例如:

根据你的数据集需要return6条记录,就这样。

MatchOperation matchOperation = Aggregation
        .match(new Criteria("customerId").is("abcd"));
ProjectionOperation projectionOperation = Aggregation
        .project("geoHash")
        .andExpression("substr(geoHash, 0, 4)").as("geoHash");
GroupOperation groupOperation = Aggregation
        .group("geoHash")
        .count().as("count");

Aggregation aggregation = Aggregation
        .newAggregation(matchOperation, projectionOperation, groupOperation);
AggregationResults<Object> aggregationResults
        = mongoTemplate.aggregate(aggregation, "collection_name", Object.class);