import java.util.ArrayList; import java.util.Date; import java.util.List;

import org.bson.Document; import org.bson.conversions.Bson;

import com.mongodb.BasicDBObject; import com.mongodb.MongoClient; import com.mongodb.client.AggregateIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase;

public class Main { public static void main(String[] args) { // 查询条件 >= start and < end Date start = new Date("2023-06-10T00:00:00.000+08:00"); Date end = new Date("2023-06-30T00:00:00.000+08:00"); String service_type = "SINOEX_STD_NBT_UK1";

	// 分位计算逻辑
	Bson quantile = new Document("$function",
			new Document("body", "function(arr, percentile) { if (!Array.isArray(arr) || arr.length === 0) { return null; } var newArray = []; for (var i = 0; i < arr.length; i++) { if (arr[i] != null) { newArray.push(Number(arr[i])); } } arr = newArray; var sortedArr = arr.slice().sort(function(a, b) { return a - b; }); var n = sortedArr.length; var k = Math.floor(n * percentile); var kn = sortedArr[k]; return kn; }")
					.append("args", new ArrayList<String>() {
						{
							add("$firstMileOutboundDiff");
							add("0.95");
						}
					}).append("lang", "js")));

	// 分组计算
	List<Bson> pipeline = new ArrayList<>();
	pipeline.add(new Document("$match", new Document("trace_first_mile_outbound.trace_time",
			new Document("$gte", start).append("$lt", end)).append("service_type", service_type)));

	Document groupBy = new Document("_id",
			new Document("date",
					new Document("$dateToString",
							new Document("date", "$trace_first_mile_outbound.trace_time").append("format",
									"%Y-%m-%d").append("timezone", "+08:00")))
											.append("service_type", "$service_type").append("so_code",
													"$so_code"));

	groupBy.append("total", new Document("$sum", 1));
	groupBy.append("firstMileOutboundDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_first_mile_outbound.trace_time");
							add("$pre_alert_time");
						}
					})));
	groupBy.append("inboundCount",
			new Document("$sum",
					new Document("$cond",
							new Document("$ifNull", new ArrayList<Object>() {
								{
									add("$trace_inbound.trace_time");
									add(false);
								}
							}))));

	groupBy.append("exceptionCount",
			new Document("$sum",
					new Document("$cond",
							new Document("$ifNull", new ArrayList<Object>() {
								{
									add("$trace_unass.trace_time");
									add(false);
								}
							}))));

	groupBy.append("inboundDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_inbound.trace_time");
							add("$trace_first_mile_outbound.trace_time");
						}
					})));

	groupBy.append("atdDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_atd.trace_time");
							add("$trace_inbound.trace_time");
						}
					})));

	groupBy.append("ataCound",
			new Document("$sum",
					new Document("$cond",
							new Document("$ifNull", new ArrayList<Object>() {
								{
									add("$trace_atd.trace_time");
									add(false);
								}
							}))));

	groupBy.append("ataDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_ata.trace_time");
							add("$trace_atd.trace_time");
						}
					})));

	groupBy.append("atdCound",
			new Document("$sum",
					new Document("$cond",
							new Document("$ifNull", new ArrayList<Object>() {
								{
									add("$trace_ata.trace_time");
									add(false);
								}
							}))));

	groupBy.append("aScanDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_a_scan.trace_time");
							add("$trace_ata.trace_time");
						}
					})));

	groupBy.append("aScanCound",
			new Document("$sum",
					new Document("$cond",
							new Document("$ifNull", new ArrayList<Object>() {
								{
									add("$trace_a_scan.trace_time");
									add(false);
								}
							}))));

	groupBy.append("deliverySuccessDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_delivery_success.trace_time");
							add("$trace_a_scan.trace_time");
						}
					})));

	groupBy.append("deliveryCount",
			new Document("$sum",
					new Document("$cond",
							new Document("$and", new ArrayList<Object>() {
								{
									add(new Document("$ifNull", new ArrayList<Object>() {
										{
											add("$trace_delivery_success.trace_time");
											add(false);
										}
									}));
									add(new Document("$ifNull", new ArrayList<Object>() {
										{
											add("$trace_a_scan.trace_time");
											add(false);
										}
									}));
								}
							}))));

	groupBy.append("deliverySuccess2firstMileOutboundDiff",
			new Document("$push", new Document("$subtract",
					new ArrayList<String>() {
						{
							add("$trace_delivery_success.trace_time");
							add("$trace_first_mile_outbound.trace_time");
						}
					})));

	pipeline.add(new Document("$group", groupBy));

	pipeline.add(new Document("$sort", new Document("_id", 1)));

	pipeline.add(new Document("$projec
查询条件 = start and endvar start = new Date2023-06-10T000000000+0800var end = new Date2023-06-30T000000000+0800var service_type = SINOEX_STD_NBT_UK1 分位计算逻辑var quantile = functionarr percentile if !A

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

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