Mongo常用语法(java代码)

1、根据agentId字段分组,并对totalCustomerNum、refundCustomerNum字段 sum求和,同时取别名

    @Overridepublic List<AgentCountInfoBean> selectCurrentMonthNewResource(Set<String> orderTypeSet, List<String> agentIds,LocalDateTime startTime, LocalDateTime endTime) {Aggregation aggr = newAggregation(match(where("agentId").in(agentIds).and("agentOrderType").in(orderTypeSet).and("agentOrderStatus").in(Arrays.asList(AgentOrderStatusEnum.NOT_START.status, AgentOrderStatusEnum.PROCESSING.status)).andOperator(EmptyUtils.isNotEmpty(startTime) ? Criteria.where("createTime").gte(startTime) : new Criteria(),EmptyUtils.isNotEmpty(endTime) ? Criteria.where("createTime").lte(endTime) : new Criteria(), EmptyUtils.isNotEmpty(endTime) ? Criteria.where("hopeStartTime").lte(endTime) : new Criteria())),group("agentId").first("agentId").as("agentId").sum("totalCustomerNum").as("totalCount").sum("refundCustomerNum").as("refundCustomerNum"));AggregationResults<AgentCountInfoBean> results = secondaryMongoTemplate.aggregate(aggr, ResAgentOrderMo.class, AgentCountInfoBean.class);if (EmptyUtils.isNotEmpty(results)) {return results.getMappedResults();}return null;}

2、对agentId分组,并统计每个agentId分组后的个数,类似于mysql的select agentId,count(agentId) from tabel group by agentId;

    @Overridepublic List<String> findNonFirstMonthBuyResource(LocalDateTime startDate, List<String> leadingEagleIds, Set<String> agentOrderSetsT) {Aggregation aggr = newAggregation(match(where("agentId").in(leadingEagleIds).and("agentOrderType").in(agentOrderSetsT).and("agentOrderStatus").ne(AgentOrderStatusEnum.NOT_PAY.status).andOperator(EmptyUtils.isNotEmpty(startDate) ? Criteria.where("payTime").lte(startDate) : new Criteria())),group("agentId").first("agentId").as("agentId").count().as("count"));AggregationResults<AgentCountBean> results = secondaryMongoTemplate.aggregate(aggr, ResAgentOrderMo.class, AgentCountBean.class);if (EmptyUtils.isNotEmpty(results)) {return results.getMappedResults().stream().map(AgentCountBean::getAgentId).collect(Collectors.toList());}return null;}

3、根据条件查询,然后只返回某个字段同时去重

    @Overridepublic List<String> findNotEndAgentIdsByTypeAndSaleAreas(Set<String> agentOrderTypes, List<String> areaIds) {Query query = query(where("agentOrderType").in(agentOrderTypes).and("agentOrderStatus").in(Arrays.asList(AgentOrderStatusEnum.NOT_START.status, AgentOrderStatusEnum.PROCESSING.status)).and("hopeStartTime").lte(LocalDateTime.now()).and("notMatchCustomerNum").gt(0).andOperator(EmptyUtils.isNotEmpty(areaIds) ? Criteria.where("areaId").in(areaIds) : new Criteria()));return secondaryMongoTemplate.findDistinct(query, "agentId", ResAgentOrderMo.class, String.class);}

4、根据两个字段分组,同时根据某个字段排序

    @Overridepublic List<AgentOrderBcVo> findFirstOrder(String agentId) {Criteria criteria = new Criteria();// 排除每日抢领活动criteria.and("agentOrderType").ne(AgentOrderTypeEnum.DAILY_GRABBING.type);criteria.and("notMatchCustomerNum").gt(0);criteria.and("agentId").is(agentId);criteria.orOperator(Criteria.where("agentOrderStatus").is(AgentOrderStatusEnum.NOT_START.status),Criteria.where("agentOrderStatus").is(AgentOrderStatusEnum.PROCESSING.status));List<AggregationOperation> operations = new ArrayList<>();operations.add(Aggregation.match(criteria));Sort sort = Sort.by(Sort.Direction.ASC, "hopeStartTime");//按照期望开始时间正序operations.add(Aggregation.sort(sort));operations.add(Aggregation.group("agentOrderType", "agentOrderDesc").first("_id").as("agentOrderId").first("payTime").as("payTime").first("agentOrderType").as("agentOrderType").first("agentOrderDesc").as("agentOrderDesc").first("agentName").as("agentName").first("phoneNumber").as("phoneNumber").first("buyCustomerNum").as("buyCustomerNum").first("giveCustomerNum").as("giveCustomerNum").first("couponCustomerNum").as("couponCustomerNum").first("payType").as("payType").first("payPrice").as("payPrice").first("agentOrderStatus").as("agentOrderStatus").first("areaName").as("areaName").first("hopeCity").as("hopeCity").first("hopeStartTime").as("hopeStartTime").first("totalCustomerNum").as("totalCustomerNum").first("notMatchCustomerNum").as("notMatchCustomerNum"));sort = Sort.by(Sort.Direction.DESC, "notMatchCustomerNum");//按累计未分配客户数量排序operations.add(Aggregation.sort(sort));Aggregation aggregation = Aggregation.newAggregation(operations);AggregationResults<AgentOrderBcVo> aggregate = secondaryMongoTemplate.aggregate(aggregation, "agentOrderMo", AgentOrderBcVo.class);return aggregate.getMappedResults();}

其中first用法是,分组时对于多条数据取第一条的数据的相关字段
5、根据某个字段分组,对某个字段求和以后,然后再筛选,类似于mysql的 select type, sum(price) as count from table group by type having count >10

    @Overridepublic List<String> filterByWeekAndMonthAndDay(String target, List<String> businessModels, String pastMonth, int monthNum,int weekNum,int dayNum,List<String> agentIds) {Aggregation aggregation = newAggregation(Aggregation.match(where("businessModel").in(businessModels).and("pastMonth").is(pastMonth).and("target").is(target).and("agentId").in(agentIds).and("isDeleted").is(false)),Aggregation.group("agentId").first("agentId").as("agentId").sum("thisMonthNum").as("monthMatchSumNum").sum("thisWeekNum").as("weekMatchSumNum").sum("todayNum").as("dayMatchSumNum"),Aggregation.match(where("monthMatchSumNum").lt(monthNum).and("weekMatchSumNum").lt(weekNum).and("dayMatchSumNum").lt(dayNum)));AggregationResults<AgentIdAndMatchNumBean> aggregate = secondaryMongoTemplate.aggregate(aggregation, ResDacMatchAgentWeightMo.class, AgentIdAndMatchNumBean.class);if (EmptyUtils.isNotEmpty(aggregate)) {List<AgentIdAndMatchNumBean> results = aggregate.getMappedResults();return results.stream().map(AgentIdAndMatchNumBean::getAgentId).collect(Collectors.toList());}return null;}

6、match, group,sort,limit一起使用

    @Overridepublic List<AgentWeightBean> findSortByAgentIds(List<String> agentIds, List<String> targets, List<String> targetExtras, String businessModel, String pastMonth, int limit) {Aggregation aggr = newAggregation(match(where("agentId").in(agentIds).and("businessModel").is(businessModel).and("pastMonth").is(pastMonth).orOperator(EmptyUtils.isNotEmpty(targets) ? Criteria.where("target").in(targets) : Criteria.where("target").is(""),EmptyUtils.isNotEmpty(targetExtras) ? Criteria.where("targetExtra").in(targetExtras) : Criteria.where("targetExtra").is("")).and("isDeleted").is(false)),group("agentId").first("agentId").as("agentId").sum("weight").as("weight"),sort(Sort.by(Sort.Direction.DESC,"weight")),limit(limit));AggregationResults<AgentWeightBean> results = secondaryMongoTemplate.aggregate(aggr, ResDacMatchAgentWeightMo.class,AgentWeightBean.class);return results.getMappedResults();}

7、更新操作

    @Overridepublic void updateTarget(String agentId, List<String> targets, List<String> targetExtras, String businessModel, String pastMonth) {Query query = query(where("agentId").is(agentId).and("businessModel").is(businessModel).and("pastMonth").is(pastMonth).orOperator(EmptyUtils.isNotEmpty(targets) ? Criteria.where("target").in(targets) : Criteria.where("target").is(""),EmptyUtils.isNotEmpty(targetExtras) ? Criteria.where("targetExtra").in(targetExtras) : Criteria.where("targetExtra").is("")).and("isDeleted").is(false));Update update =  update("updateTime",LocalDateTime.now())//inc是自增操作,原子性操作.inc("todayNum",1).inc("thisWeekNum",1).inc("twoWeekNum",1).inc("thisMonthNum",1).inc("weight",-0.08);secondaryMongoTemplate.updateMulti(query,update,ResDacMatchAgentWeightMo.class);}

8、聚合查询时对多个字段进行运算符操作,比如 sum,divide

    @Overridepublic List<ReportAgentBean> getReportDataByAId(String aId, String aIdType, String reportType, String reportDate) {Query query = new Query();Criteria criteria = new Criteria();criteria.and("aIdType").is(aIdType);criteria.and("reportType").is(reportType);criteria.and("aId").is(aId);criteria.and("reportDate").is(reportDate);query.addCriteria(criteria);Aggregation aggregation = newAggregation(//project表示需要用到那些字段,返回那些字段Aggregation.project(PROJECT_FIELDS)//总标化保费.and(this.totalCriterionAmountExpression()).as("totalCriterionAmount")//成交服务单均保费.and(this.averageIssueAmountExpression()).as("averageIssueAmount")//件均保费.and(this.averageAmountExpression()).as("averageAmount").and(this.totalAmountExpression()).as("totalAmount").and(this.pmAgentNumRateExpression()).as("pmAgentNumRate"),Aggregation.match(criteria),Aggregation.sort(Sort.by(Sort.Direction.DESC, "totalCriterionAmount")));AggregationResults<ReportAgentBean> results = mongoTemplate.aggregate(aggregation, ReportAgentDataMo.class, ReportAgentBean.class);return results.getMappedResults();}private static final String[] PROJECT_FIELDS = {"id", "aIdType", "aId", "reportDate", "reportType", "advanceCriterionAmountDacT", "advanceNumDacT","advanceAmountDacT", "buyCustDacT", "giveCustDacT", "matchDacT", "upToStandardNum","pmDacT", "nonPmDacT", "policyConfirmNumDacT", "policyConfirmOrderNumDacT","upToStandardAgentNum", "dealInternetAmountDacT", "dealLifeAmountDacT","dealLifeCriterionAmountDacT", "dealHighAmountDacT", "dealCarAmountDacT", "dealGroupAmountDacT","dealHighCriterionAmountDacT", "dealCarCriterionAmountDacT", "dealGroupCriterionAmountDacT", "digitalAgentNum","dealInternetNumDacT", "dealLifeNumDacT", "dealHighNumDacT", "dealCarNumDacT", "cashCoupon", "cashCouponAmount","dealGroupNumDacT", "createTime"};//totalCriterionAmountExpression这个方法返回的数据5个字段相加后的结果private AggregationExpression totalCriterionAmountExpression() {return ArithmeticOperators.Add.valueOf("dealInternetAmountDacT").add("dealHighCriterionAmountDacT").add("dealCarCriterionAmountDacT").add("dealGroupCriterionAmountDacT").add("dealLifeCriterionAmountDacT");}//averageIssueAmountExpression这个方法会拿到totalCriterionAmountExpression方法的返回值然后和policyConfirmNumDacT字段相除private AggregationExpression averageIssueAmountExpression() {AggregationExpression totalCriterionAmount = this.totalCriterionAmountExpression();return ConditionalOperators.when(new Criteria("policyConfirmNumDacT").ne(0)).thenValueOf(ArithmeticOperators.Divide.valueOf(totalCriterionAmount).divideBy("policyConfirmNumDacT")).otherwise(0);}

9、聚合查询时的分页查询

    @Overridepublic List<ReportAgentBean> digitalAgentQuery(PageMsg pageMsg) {Criteria criteria = new Criteria();criteria.and("aIdType").is(AIdTypeEnum.agent.name());criteria.and("reportType").is(ReportTypeEnum.TOTAL.type);//累计服务单数 大于等于30criteria.and("digitalSvNum").gte(DigitalLevelEnum.digital_1.matchDacT);//标化总保费大于 5Wcriteria.and("digitalPolicyPerformance").gte(DigitalLevelEnum.digital_1.totalCriterionAmount);//累计成交订单数 大于5criteria.and("digitalTurnoverPerformance").gte(DigitalLevelEnum.digital_1.policyConfirmNumDacT);Aggregation aggregation = newAggregation(Aggregation.match(criteria),Aggregation.project(DIGITAL_FIELDS)//总标化保费.and("digitalPolicyPerformance").as("totalCriterionAmount").and("digitalSvNum").as("matchDacT").and("digitalTurnoverPerformance").as("policyConfirmNumDacT"),Aggregation.sort(Sort.by(Sort.Direction.DESC, "totalCriterionAmount")),Aggregation.skip((long) (pageMsg.getPageNum() - 1) * pageMsg.getPageSize()),Aggregation.limit(pageMsg.getPageSize()));AggregationResults<ReportAgentBean> results = mongoTemplate.aggregate(aggregation, ReportAgentDataMo.class, ReportAgentBean.class);return results.getMappedResults();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.4 Go 映射(Map)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【vuejs】组件中 data 函数的作用和分析

1. 组件复用性与数据隔离 组件在Vue中是用于复用的&#xff0c;每个组件实例应该拥有自己的独立状态&#xff0c;以避免不同组件实例之间的数据冲突和相互影响。Vue通过将组件的data定义为一个函数来实现这一点。 1.1 组件复用性 组件复用性是指组件可以在多个地方被重复使用…

Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)

前言&#xff1a;异常处理是 Java 编程中非常重要的一部分&#xff0c;它能够有效地捕获和处理程序运行中的错误&#xff0c;提高代码的健壮性和可靠性。本文将深入探讨 Java 中异常的概念、体系结构、抛出、解决方式以及如何自定义异常&#xff0c;并结合代码案例进行详细解释…

mysql 如果有按照时间范围查询结果

1.前端传2024-06-21 到我们xml sql 文件中默认实际是 2024-06-21 00:00:00 <if test"dto.startTime ! null">and ps.created_at > #{dto.startTime}</if><if test"dto.endTime ! null">and ps.created_at < #{dto.endTime}</if…

Java 面试题:Java 的动态代理是基于什么原理?

编程语言通常有各种不同的分类角度&#xff0c;动态类型和静态类型就是其中一种分类角度&#xff0c;简单区分就是语言类型信息是在运行时检查&#xff0c;还是编译期检查。 与其近似的还有一个对比&#xff0c;就是所谓强类型和弱类型&#xff0c;就是不同类型变量赋值时&…

Stage #1 无过滤的XSS注入:基础与实操

Stage #1 无过滤的XSS注入&#xff1a;基础与实操 跨站脚本攻击&#xff08;XSS&#xff09;是Web安全领域中一种常见的攻击手段。在"XSS Challenges"闯关游戏中&#xff0c;Stage #1专为初学者设计&#xff0c;用于练习无过滤的XSS注入技术。本文将详细介绍这一阶段…

Linux命令篇(六):vi/vim专项

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝您生活愉快&#xff01; 文章目录 一、什么是vim二…

Microsoft Outlook Lite 引入短信功能

随着科技的不断进步&#xff0c;我们的沟通方式也在不断演变。微软最新推出的 Outlook Lite 应用&#xff0c;不仅为我们提供了一个轻量级的电子邮件管理工具&#xff0c;现在更是带来了一项令人兴奋的新功能——短信服务。 Outlook Lite&#xff1a;轻量级&#xff0c;功能全…

【.Net】Linq的使用

文章目录 一、Linq介绍二、在两个数据源联合查询中的使用三、Linq的其他用法 一、Linq介绍 LINQ&#xff08;Language Integrated Query&#xff09;是C#中的一个强大功能&#xff0c;允许您使用统一的语法查询和操作来自不同数据源的数据。 二、在两个数据源联合查询中的使用…

今日好料推荐(ARM嵌入式)

今日好料推荐&#xff08;ARM嵌入式&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 给我留言&#xff0c;会帮大家寻找需要的资料。 ARM 嵌入式系统 嵌入式系统在现代电子设备中扮演着至关重要的角色&#xff0c;从智能手机到工业自动化&am…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

HALCON-从入门到入门-形态学操作-千变万化的region

1.废话 计算机视觉中的形态学操作是一种基本的数字图像处理技术&#xff0c;主要用于图像的形态结构改变&#xff0c;以便执行前后景分割、形状检测等任务。 膨胀&#xff08;Dilation&#xff09;&#xff1a; 膨胀操作是将结构元素在图像上滑动&#xff0c;如果结构元素与图…

CMakeFile.txt通过sysroot方式后生成makefile报错

报错信息如下&#xff1a; -- The C compiler identification is unknown -- The CXX compiler identification is unknown -- Check for working C compiler: /home/xj/asm/host/bin/aarch64-buildroot-linux-gnu-gcc -- Check for working C compiler: /home/xj/asm/host/bi…

Vue CLI:Vue CLI是一个强大的工具,可以帮助开发者快速地创建和管理Vue项目。我们可以讨论它的一些核心特性,比如热重载、懒加载等

Vue CLI简介 Vue CLI简介 Vue CLI,全称Vue Command Line Interface,是一个基于Vue.js进行快速开发的完整系统。它帮助开发者通过提供一整套工具来提高项目的开发效率。Vue CLI包括了从项目创建到代码调试,再到最终打包部署的全流程式的解决方案。 定义和用途 Vue CLI的…

VScode远程连接linux服务器开发,误删了文件怎么找回。

VScode远程连接linux服务器开发&#xff0c;误删了代码文件 因为远程服务器大家都在用&#xff0c;没有足够权限去折腾。找遍了没找到方法&#xff0c;就告诉我远程的文件本地没有缓存啊&#xff01;我就差点开始重写代码了。 后来被我发现了TIMELINE功能&#xff0c;这个功能…

YUM安装httpd实验配置apache

实验目的及实验要求&#xff1a; 实验目的&#xff1a; 2.实验要求&#xff1a; &#xff08;1&#xff09;完成命令的编写&#xff0c;并能正确运行&#xff1b; &#xff08;2&#xff09;从中熟练掌握命令的功能及作用。 实验设备及软件&#xff1a; pc机 配置好Lin…

【推荐系统-特征工程】把item的tag加工为特征的三种方式

1&#xff0c;高订单tag的top1-10的tag-id&#xff0c;作为user的单侧共10维特征的value 即一个list作为user单侧特征 缺点&#xff1a;丢失了user对每个tag的订单数量和tag-rank10以外的tag信息 2&#xff0c;高订单tag的top1-10的订单量&#xff0c;和高订单tag的top1-10的t…

叉积和法向量学习笔记

目录 叉积用的内积 相似点 给定平面上的两个向量 A 和 B&#xff0c;叉积和法向量相等吗 理解这点的关键&#xff1a; 结论&#xff1a; 叉积判断平面内两个向量是否相交 叉积&#xff08;Cross Product&#xff09;和法向量&#xff08;Normal Vector&#xff09;确实有…

GPT-4o能力评价与个人感受

GPT-4o是OpenAI最新推出的人工智能模型&#xff0c;与其前身GPT-4相比有了显著的提升。以下是对GPT-4o技术能力的评价以及版本间的对比分析和个人整体感受。 技术能力 1. 多模态能力&#xff1a; GPT-4o具备真正的多模态能力&#xff0c;能够处理和生成文本、音频和视觉输入和…

js 给数组对象添加多个属性

// 假设有一个数组对象 let items [{ id: 1, name: Item 1 },{ id: 2, name: Item 2 },{ id: 3, name: Item 3 } ];// 要添加的新属性 const newProps {newProp1: value1,newProp2: value2 };// 使用map方法添加新属性 let updatedItems items.map(item > ({ ...item, ..…