我正在与Spring Boot v2.0.5
合作。我的数据如下:
[
{
"name": "bob",
"score": 20,
"date": 1578940321
},
{
"name": "tom",
"score": 20,
"date": 1578940321
},
{
"name": "mike",
"score": 20,
"date": 1578965903
},
{
"name": "bob",
"score": 10,
"date": 1578965903
},
{
"name": "tom",
"score": 10,
"date": 1578965903
}
]
我正尝试在两个日期之间进行分页生成某种报告。假设每页需要2个不同的名称。
需要根据每个记录的得分总和(按名称分组)对报告进行排序。例如bob为30,tom为30,mike为20,持续时间为1578940321至1578965903。
如何获取每页的唯一名称,例如鲍勃和汤姆(第1页)和麦克(第2页)。
以下是我尝试过的内容:
方法1
DistinctIterable list = mongoTemplate.getCollection(statsCollectionName)
.distinct("name", query.getQueryObject(), Object.class);
方法2
Bson pika = BsonDocument.parse(String.format("{'date': {$gte: %d, $lte: %d}}", startStamp, endDate));
DistinctIterable<Document> p = mongoTemplate.getCollection(statsCollectionName)
.distinct("name", Document.class).filter(pika);
p.iterator().forEachRemaining(x -> {
System.out.println("");
});
我似乎无法使其正常工作。
答案 0 :(得分:0)
您必须使用汇总将其按名称分组,并按总得分进行排序,例如:在mongo shell上:
db.st20.aggregate([{$group : {_id:"$name", totalScore: {$sum: "$score"} } }, {$sort: {totalScore:-1} }, {$limit: 2}])
可能的输出:
{ "_id" : "bob", "totalScore" : 30 }
{ "_id" : "tom", "totalScore" : 30 }
您可以在上述查询中将$limit
值作为变量传递。
要在Spring Data存储库中进行查询,请查看Aggregation Framework Support的官方文档
spring数据聚合的示例:https://www.baeldung.com/spring-data-mongodb-projections-aggregations