使用分页MongoDB获取按分组数据总和排序的不同值

时间:2019-05-10 19:50:57

标签: java mongodb spring-boot mongodb-query

我正在与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("");
    });

我似乎无法使其正常工作。

1 个答案:

答案 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