java 调用Mongo的驱动orgmongodbmongo-java-driver31211做聚合查询首先筛选出开始时间和结束时间这两个字段相差大于一个小时的记录其中的开始时间和结束时间都是yyyy-MM-dd HHmmss格式的字符串类型并按照任务名统计每个任务大于1小时的个数取出每个任务的最大时间间隔和最小时间间隔换算成小时作为一个聚合查询返回最终结果返回
以下是一个使用Mongo Java驱动进行聚合查询的示例代码:
import com.mongodb.MongoClient;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class MongoAggregationExample {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoCollection<Document> collection = mongoClient.getDatabase("your_database_name")
.getCollection("your_collection_name");
// 定义聚合管道
Document matchStage = new Document("$match", new Document("$expr",
new Document("$gt", Arrays.asList(new Document("$subtract", Arrays.asList(
parseDate("$endTime"), parseDate("$startTime"))), 3600000)))));
Document groupStage = new Document("$group", new Document("_id", "$taskName")
.append("count", new Document("$sum", 1))
.append("maxInterval", new Document("$max", new Document("$subtract", Arrays.asList(
parseDate("$endTime"), parseDate("$startTime")))))
.append("minInterval", new Document("$min", new Document("$subtract", Arrays.asList(
parseDate("$endTime"), parseDate("$startTime")))))));
Document projectStage = new Document("$project", new Document("_id", 0)
.append("taskName", "$_id")
.append("count", 1)
.append("maxInterval", new Document("$divide", Arrays.asList("$maxInterval", 3600000)))
.append("minInterval", new Document("$divide", Arrays.asList("$minInterval", 3600000))));
AggregateIterable<Document> result = collection.aggregate(Arrays.asList(matchStage, groupStage, projectStage));
for (Document document : result) {
System.out.println(document.toJson());
}
mongoClient.close();
}
private static Date parseDate(String dateString) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return format.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
请将示例代码中的your_database_name和your_collection_name替换为实际的数据库和集合名称。聚合管道包括三个阶段:$match阶段用于筛选出开始时间和结束时间相差大于一个小时的记录,$group阶段用于按任务名进行分组并计算大于1小时的个数、最大时间间隔和最小时间间隔,$project阶段用于重命名字段并将时间间隔转换为小时。最后,通过AggregateIterable迭代结果并打印输出。
注意,示例代码中的parseDate方法用于将字符串类型的时间转换为java.util.Date对象,以便进行日期计算
原文地址: https://www.cveoy.top/t/topic/hBQh 著作权归作者所有。请勿转载和采集!