Migrate the following Java code from spring-data-mongodb to pure java mongodb-driver-reactivestreamsGetMappingfrontendOverallStat public Object frontendOverallStat RequestParamname = project
@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);
}
原文地址: https://www.cveoy.top/t/topic/bh3b 著作权归作者所有。请勿转载和采集!