@GetMapping("/frontendOverallStat") public Object frontendOverallStat( @RequestParam(name = "projectId", required = false) String projectId, @RequestParam(name = "submoduleId", required = false) Integer submoduleId ) {

List<Bson> pipeline = new ArrayList<>();

pipeline.addAll(KapokLogPresenterApiController.optionalMatchSubmoduleId(submoduleId));

pipeline.add(Aggregates.match(
    Filters.and(
        Filters.eq("category", "navigation"),
        Filters.exists("timestamp"),
        Filters.gt("timestamp", (double)(OffsetDateTime.now().minusDays(1).toInstant().toEpochMilli()) / 1000),
        Filters.exists("data.to"),
        Filters.ne("data.to", "")
    )
));

pipeline.add(Aggregates.lookup(kapokMongoProvider.getMongoTransactionsCollectionName(projectId), "event_id", "event_id", "transactionObject"));
pipeline.add(Aggregates.lookup(kapokMongoProvider.getMongoEventsCollectionName(projectId), "event_id", "event_id", "eventObject"));

pipeline.add(Aggregates.project(
    Projections.fields(
        Projections.include("timestamp", "data"),
        Projections.computed("transactionObject", Document.parse("{$arrayElemAt: ['$transactionObject', 0]}")),
        Projections.computed("eventObject", Document.parse("{$arrayElemAt: ['$eventObject', 0]}"))
    )
));

pipeline.add(Aggregates.group(
    Fields.fields("timestamp", "data.to"),
    Accumulators.first("txUserId", "$transactionObject.user.id"),
    Accumulators.first("evUserId", "$eventObject.user.id"),
    Accumulators.first("evLevel", "$eventObject.level")
));

pipeline.add(Aggregates.project(
    Projections.fields(
        Projections.excludeId(),
        Projections.computed("timestamp", "$_id.timestamp"),
        Projections.computed("path", "$_id.to"),
        Projections.computed("userId", Document.parse("{ $ifNull: ['$txUserId', '$evUserId'] }")),
        Projections.computed("hasError", Document.parse("{ $eq: ['$evLevel', 'error'] }"))
    )
));

pipeline.add(Aggregates.match(Filters.exists("userId")));

pipeline.add(Aggregates.group(
    Fields.fields("path", "userId"),
    Accumulators.sum("errorNum", Document.parse("{ $cond: [{ $eq: ['$hasError', true] }, 1, 0] }")),
    Accumulators.sum("pageAccessNum", 1)
));

pipeline.add(Aggregates.project(
    Projections.fields(
        Projections.excludeId(),
        Projections.computed("path", "$_id.path"),
        Projections.computed("userId", "$_id.userId"),
        Projections.computed("errorNum", "$errorNum"),
        Projections.computed("pageAccessNum", "$pageAccessNum")
    )
));

pipeline.add(Aggregates.group(
    "$userId",
    Accumulators.sum("errorNum", "$errorNum"),
    Accumulators.sum("pageAccessNum", "$pageAccessNum"),
    Accumulators.sum("pageNum", 1)
));

pipeline.add(Aggregates.project(
    Projections.fields(
        Projections.excludeId(),
        Projections.computed("userId", "$_id"),
        Projections.computed("errorNum", "$errorNum"),
        Projections.computed("pageAccessNum", "$pageAccessNum"),
        Projections.computed("pageNum", "$pageNum")
    )
));

pipeline.add(Aggregates.group(
    null,
    Accumulators.sum("totalUserNum", 1),
    Accumulators.sum("totalErrorNum", "$errorNum"),
    Accumulators.sum("pageAccessNum", "$pageAccessNum")
));

pipeline.add(Aggregates.project(
    Projections.fields(
        Projections.excludeId(),
        Projections.computed("totalUserNum", "$totalUserNum"),
        Projections.computed("avgErrorNumPerPageAccess", Document.parse("{ $divide: ['$totalErrorNum', '$pageAccessNum'] }")),
        Projections.computed("avgPageAccessNumPerUser", Document.parse("{ $divide: ['$pageAccessNum', '$totalUserNum'] }"))
    )
));

return Optional.ofNullable(MongoClients.create().getDatabase(dbName).getCollection(kapokMongoProvider.getMongoBreadcrumbsCollectionName(projectId), Document.class)
    .aggregate(pipeline).first())
    .orElse(frontendOverallStatDefaultDocument);

}

Migrate the following Java code from spring-data-mongodb to pure java mongodb-driver-reactivestreamsGetMappingfrontendOverallStat public Object frontendOverallStat RequestParamname = project

原文地址: https://www.cveoy.top/t/topic/bh3b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录