如何使用 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);
我们有这个数据:
{ "_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);