做网站广告费装饰网站案例

web/2025/9/28 1:37:49/文章来源:
做网站广告费,装饰网站案例,徐州网约车公司哪家好,wordpress代码优化插件缘由 MongoDB数据库如下#xff1a; 如上截图#xff0c;使用MongoDB客户端工具DataGrip#xff0c;在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: }#xff0c;即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求#xff1a;用Java代码来查询…缘由 MongoDB数据库如下 如上截图使用MongoDB客户端工具DataGrip在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: }即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求用Java代码来查询指定渠道和创建日期在指定时间区间范围内的数据。 注意到creationDate是一个一级字段方便理解profiles字段和creationDate属于同一级是一个数组而profiles.channel是一个嵌套字段。 Java应用程序查询指定渠道通过Query注解profiles.channel和指定日期的数据Dao层或叫Repository层接口Interface代码如下 import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query;Repository public interface AccountRepository extends MongoRepositoryAccount, String {Query({ profiles.channel: ?0 })ListAccount findByProfileChannelAndCreationDateBetween(String channel, Date start, Date end); }单元测试代码如下 Test public void testFindByProfileChannelAndCreationDateBetween() {String time 2024-01-21;String startTime time DateUtils.DAY_START;String endTime time DateUtils.DAY_END;Date start new Date();Date end new Date();try {start DateUtils.parseThenUtc(startTime);end DateUtils.parseThenUtc(endTime);} catch (ParseException e) {log.error(test failed: {}, e.getMessage());}ListAccount accountList accountRepository.findByProfileChannelAndCreationDateBetween(ChannelEnum.DATONG_APP.getChannelCode(), start, end);log.info(size:{}, accountList.size()); }输出如下size:70829。 没有报错但是并不能说明没有问题。根据自己对于业务的理解数据量显然不对劲此渠道的全量数据是这么多才差不多。 也就是说上面的Interface接口查询方法只有渠道条件生效日期没有生效 至于为什么没有生效请继续往下看。想看结论的直接翻到文末。 排查 不生效 MongoRepository是Spring Data MongoDB提供的继承MongoRepository之后就可以使用IDEA的智能提示快速编写查询方法。如下图所示 但是上面的这种方式只能对一级字段生效。如果想要过滤查询嵌套字段则派不上用场。 此时需要使用一个更强大的Query注解。 但是Query和JPA方式不能一起使用。也就是上面的方法findByProfileChannelAndCreationDateBetween查询方法经过简化后只保留一级字段然后嵌套字段使用Query方式 Query({ profiles.channel: ?0 }) ListAccount findByCreationDateBetween(String channel, Date s1, Date s2);依旧是不生效的。 版本1 基于上面的结论有一版新的写法 Query({ profiles.channel: ?0, creationDate: {$gte: ?1, $lte: ?2} }) ListAccount findByChannelAndCreationDate(String channel, Date start, Date end);此时输出size:28。这个数据看起来才比较正常虽然后面的结论证明不是正确的。 WARN告警 如果不过滤渠道呢查询某个日期时间段内所有渠道的全量用户数据 两种写法都可以 long countByCreationDateBetween(Date start, Date end);Query({ creationDate: {$gte: ?0, $lte: ?1} }) long countByCreationDate(Date start, Date end);等等。怎么第一种写法IDEA给出一个WARN MongoDB日期 上面IDEA给出的Warning显而易见。因为MongoDB数据库字段定义是Instant类型 Data Document public class Account {Idprotected String key;private Instant creationDate Instant.now();private ListProfile profiles new ArrayList();private boolean firstTimeUsage true; }IDEA作为宇宙最强IDE给出WARN自然是有道理的。 作为一个代码洁癖症患者看到IDEA的shi黄色告警无法忍受。假设IDEA告警没有问题极端少数情况下IDEA告警也有可能误报参考记一次Kotlin Visibility Modifiers引发的问题为了消除告警有两种方式 修改Account数据库实体类creationDate类型定义Instant改成DateRepository层接口方法不使用Date类型传参而使用Instant类型传参。 那到底应该怎么修改呢才能屏蔽掉IDEA的shi黄色告警WARN呢 单元测试 数据库持久化实体PO类日期字段类型定义到底该使用Date还是Instant类型呢 在Google搜索关键词MongoDB日期的同时不妨写点单元测试来执行一下。注此时此处行文看起来思路挺清晰但在遇到陌生的问题是真的是无头苍蝇 在保持数据库PO实体类日期字段类型定义不变的前提下有如下两个查询Interface方法 long countByCreationDateBetween(Date start, Date end);Query({ creationDate: {$gte: ?0, $lte: ?1} }) long countByCreationDate(Instant start, Instant end);单元测试 Resource private MongoTemplate mongoTemplate; Resource private IAccountRepository accountRepository;Test public void testCompareDateAndInstant() {String time 2024-01-21;String startTime time DateUtils.DAY_START;String endTime time DateUtils.DAY_END;Date start new Date();Date end new Date();try {start DateUtils.parseThenUtc(startTime);end DateUtils.parseThenUtc(endTime);} catch (ParseException e) {log.error(testCompareDateAndInstant failed: {}, e.getMessage());}Criteria criteria Criteria.where(creationDate).gte(start).lte(end);long count1 mongoTemplate.count(new Query(criteria), Account.class);// idea warnlong count2 accountRepository.countByCreationDateBetween(start, end);long count3 accountRepository.countByCreationDate(DateUtils.getInstantFromDateTimeString(startTime), DateUtils.getInstantFromDateTimeString(endTime));long count4 accountRepository.countByCreationDate(DateUtils.parse(startTime).toInstant(), DateUtils.parse(endTime).toInstant());log.info(date:{},count1:{},count2:{},count3:{},count4:{}, time, count1, count2, count3, count4); }单元测试执行后打印输出date:2024-01-21,count1:35,count2:35,count3:32,count4:29。 换几个不同的日期count1和count2都是一致的。也就是说不管是使用Template还是Repository方式使用Date类型日期查询MongoDB数据结果是一样的。count3和count4使用Instant类型查询MongoDB数据结果不一致并且和Date类型不一致。 为啥呢 Instant vs Date MongoDB中的日期使用Date类型表示在其内部实现中采用一个64位长的整数该整数代表的是自1970年1月1日零点时刻UTC以来所经过的毫秒数。Date类型的数值范围非常大可以表示上下2.9亿年的时间范围负值则表示1970年之前的时间。 MongoDB的日期类型使用UTCCoordinated Universal Time进行存储也就是0时区的时间。我们处于8时区北京标准时间因此真实时间值比ISODateMongoDB存储时间多8个小时。也就是说MongoDB存储的时间比ISODate早8小时。 验证8小时 通过DataGrip查看数据库集合字段类型是ISODate 其格式是yyyy-MM-ddTHH:mm:ss.SSSZ 然后再看看时区问题。 同一个用户产生的数据用户唯一ID都是65af62bee13f080008816500在MySQL和MongoDB里都有记录。 MySQL数据如下因为涉及敏感信息截图截得比较小熟悉DataGrip的同学看到Tx: Auto应该不难猜到就是MySQL 而MongoDB记录的数据如下同样也是出于截图敏感考虑主流数据库里使用到ObjectId的应该不多吧MongoDB是一个 不难发现。MySQL里记录的数据比MongoDB里记录的数据晚8小时也是一个符合实际的数据。 PS此处的所谓符合实际指的是符合用户习惯我们App是一款低频App极少有用户在半夜或凌晨使用而MongoDB里则记录着大量凌晨的数据实际上应该是北京时间早上的用户使用记录和数据。 从上面两个截图来看虽然有打码处理但依稀可以看到确实参考下面在线加解密工具网站是同一个用户手机号产生的两个不同数据库MySQL及MongoDB数据。 证明MongoDB里存储的数据确实比MySQL的数据早8小时。 解决方案 PO实体类保持Instant类型不变Repository层Interface接口方法传参Instant。平常使用的Date如何转换成Instant呢 直接toInstant()即可也就是上面的单元测试里面的第四种方式。方法定义 /*** 加不加Query注解都可以。* 加注解的话方法名随意见名知意即可。* 不加注解的话则需要保证查询字段是MongoDB一级字段并且满足JPA约定大于配置规范。*/ Query({ creationDate: {$gte: ?0, $lte: ?1} }) long countByCreationDate(Instant start, Instant end);查询方法 long count accountRepository.countByCreationDate(DateUtils.parse(startTime).toInstant(), DateUtils.parse(endTime).toInstant());源码分析 Date.toInstant()源码 private transient BaseCalendar.Date cdate; private transient long fastTime;public Instant toInstant() {return Instant.ofEpochMilli(getTime()); }/*** Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT* represented by this Date object.*/ public long getTime() {return getTimeImpl(); }private final long getTimeImpl() {if (cdate ! null !cdate.isNormalized()) {normalize();}return fastTime; }private final BaseCalendar.Date normalize() {if (cdate null) {BaseCalendar cal getCalendarSystem(fastTime);cdate (BaseCalendar.Date) cal.getCalendarDate(fastTime,TimeZone.getDefaultRef());return cdate;}// Normalize cdate with the TimeZone in cdate first. This is// required for the compatible behavior.if (!cdate.isNormalized()) {cdate normalize(cdate);}// If the default TimeZone has changed, then recalculate the// fields with the new TimeZone.TimeZone tz TimeZone.getDefaultRef();if (tz ! cdate.getZone()) {cdate.setZone(tz);CalendarSystem cal getCalendarSystem(cdate);cal.getCalendarDate(fastTime, cdate);}return cdate; }Instant.java源码 /*** Constant for the 1970-01-01T00:00:00Z epoch instant.*/ public static final Instant EPOCH new Instant(0, 0);public static Instant ofEpochMilli(long epochMilli) {long secs Math.floorDiv(epochMilli, 1000);int mos Math.floorMod(epochMilli, 1000);return create(secs, mos * 1000_000); } private static Instant create(long seconds, int nanoOfSecond) {if ((seconds | nanoOfSecond) 0) {return EPOCH;}if (seconds MIN_SECOND || seconds MAX_SECOND) {throw new DateTimeException(Instant exceeds minimum or maximum instant);}return new Instant(seconds, nanoOfSecond); }附 敏感数据加解密 上面截图MySQL表里对手机号没有加密处理直接明文存储而在MongoDB数据库里则进行ECB加密。加密工具类略 此处附上一个好用的在线加密工具网站可用于加密手机号等比较敏感的数据编码一般选择Base64位数、模式、填充、秘钥等信息和工具类保持一致除密钥外一般都是默认 工具类 DateUtils.java工具类源码如下 public static final String DAY_START 00:00:00; public static final String DAY_END 23:59:59; public static final String DATE_FULL_STR yyyy-MM-dd HH:mm:ss;/*** 使用预设格式提取字符串日期** param date 日期字符串*/ public static Date parse(String date) {return parse(date, DATE_FULL_STR); }/*** 不建议使用1945-09-01 和 1945-09-02 with pattern yyyy-MM-dd 得到不一样的时间数据* 前者 CDT 后者 CST* 指定指定日期字符串*/ public static Date parse(String date, String pattern) {SimpleDateFormat df new SimpleDateFormat(pattern);try {return df.parse(date);} catch (ParseException e) {log.error(parse failed, e);return new Date();} }public static Date parseThenUtc(String date, String dateFormat) throws ParseException {SimpleDateFormat format new SimpleDateFormat(dateFormat);Date start format.parse(date);Calendar calendar Calendar.getInstance();calendar.setTime(start);calendar.add(Calendar.HOUR, -8);return calendar.getTime(); }/*** 减 8 小时*/ public static Date parseThenUtc(String date) throws ParseException {return parseThenUtc(date, DATE_FULL_STR); }中文解析 SimpleDateFormat作为Java开发中最常用的API之一。 你真的熟悉吗 线程安全问题 是否支持中文日期解析呢 具体来说是否支持如yyyy年MM月dd日格式的日期解析 测试程序 public static void main(String[] args) {log.info(getNowTime(yyyy年MM月dd日)); }public static String getNowTime(String type) {SimpleDateFormat df new SimpleDateFormat(type);return df.format(new Date()); }打印输出如下 2024年01月23日结论SimpleDateFormat支持对中文格式的日期进行解析。 看一下SimpleDateFormat的构造函数源码 public SimpleDateFormat(String pattern) {this(pattern, Locale.getDefault(Locale.Category.FORMAT)); }继续深入查看Locale.java源码 private static Locale initDefault(Locale.Category category) {Properties props GetPropertyAction.privilegedGetProperties();return getInstance(props.getProperty(category.languageKey,defaultLocale.getLanguage()),props.getProperty(category.scriptKey,defaultLocale.getScript()),props.getProperty(category.countryKey,defaultLocale.getCountry()),props.getProperty(category.variantKey,defaultLocale.getVariant()),getDefaultExtensions(props.getProperty(category.extensionsKey, )).orElse(defaultLocale.getLocaleExtensions())); }大概得知SimpleDateFormat对于本地化语言的支持是通过Locale国际化实现的。 ISODate 另外在使用SimpleDateFormat解析这种时间时需要对T和Z加以转义。 public static final String FULL_UTC_STR yyyy-MM-ddTHH:mm:ssZ; public static final String FULL_UTC_MIL_STR yyyy-MM-ddTHH:mm:ss.SSSZ;public static String getBirthFromUtc(String dateStr) {SimpleDateFormat df new SimpleDateFormat(FULL_UTC_STR);try {Date date df.parse(dateStr);Calendar calender Calendar.getInstance();calender.setTime(date);calender.add(Calendar.HOUR, 8);return date2Str(calender.getTime(), DATE_SMALL_STR);} catch (ParseException e) {throw new RuntimeException(e);} }结论 几个结论 JPA写法对于单表查询非常简单借助于IDEA智能提示可以快速写出查询Interface方法JPA很强但对于关系型数据库的多表Join查询或MongoDB的嵌套字段查询则几乎派不上用场Query通过注解的方式可以大大简化API的使用Query写法和JPA写法不能混为一谈Query也不是万能的。必要时还是得使用QBEQuery By Example或Query Criteria 参考 MongoDB进阶与实战微服务整合、性能优化、架构管理

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

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

相关文章

济南在线制作网站商丘做网站需要多少钱

准备工作1.安装scrapy_redis包,打开cmd工具,执行命令pip install scrapy_redis2.准备好一个没有BUG,没有报错的爬虫项目3.准备好redis主服务器还有跟程序相关的mysql数据库前提mysql数据库要打开允许远程连接,因为mysql安装后root用户默认只允许本地连接,详情请看此文章部署过程…

武侯区建设局门户网站制作网站的公司电话号码

目录 前言 知识储备 图像处理常用算法 算法原理 传统分割方法 1.基于阈值的分割方法

小型企业网站建设的背景清河网站建设公司

文章目录如何生成采购单系统生成采购单的流程基本流程扩展流程找不到符合条件的供应商,要求部分退款(初次生成采购单时)找不到符合条件的供应商,要求全部退款(初次生成采购单时)指定供应商的库存不足&#…

手机微信官方网站首页网页禁止访问怎么办

第十一届蓝桥杯大赛软件赛省赛C/C 大学 B 组 文章目录 第十一届蓝桥杯大赛软件赛省赛C/C 大学 B 组1、字串排序2、门牌制作3、既约分数4、蛇形填数5、跑步锻炼6、七段码7、成绩统计8、回文日期9、子串分值和10、平面切分 1、字串排序 // 转载博客链接 https://blog.csdn.net/we…

店铺详情页设计模板龙斗seo博客

在线订餐系统mysql字段,随便写的了。也许要改变呢。再说吧啊。在线订餐系统mysql字段分成3个表开发1.user2.order3.pay1.用户表包含下面字段 id int 主键,自动累加,不为空,长度10就够了吧;用户名(name) varchar类型 30长度够了吧。…

p2p网站建设报价2p排名绵阳高新区建设局网站

简介 Pyenv 是一个 python 解释器管理工具,可以对计算机中的多个 python 版本进行管理和切换。为什么要用 pyenv 管理python呢,用过的 python 人都知道,python 虽然是易用而强大的编程语言,但是 python 解释器却有多个版本&#…

建筑公司网站广告宣传语高校网站建设近期情况说明

问题窥探之前有个哥们在使用Newtonsoft.Json反序列化的时候,发现明明有数据,但是就是序列化不出来数据到实体里面。咋一看,确实没什么问题啊,字符串的数据是存在的。那么问题出在哪里呢。解决思路1、我让他把字符串复制出来&#…

国外域名注册做违法网站新浪云上传wordpress

如果您使用Java进行编程的时间足够长,则有可能需要为业务用户生成报告。 就我而言,我已经看到几个项目使用JasperReports库来生成PDF和其他文件格式的报告。 最近,我荣幸地观察了Mike和他的团队使用上述报告库及其面临的挑战。 简而言之Jasp…

学校资源网站建设方案wordpress导入文件格式

0 算法简介 快速排序是一种高效率排序算法,它是对冒泡排序的一种改进,它也是一种不稳定排序算法。快速排序的核心是比较、交换和递归。 在待排序数组中指定一个基准元素pivot(一般选取数组首元素),使得数组排序之后基…

网站建设视频l网站开发主框架一般用什么布局

3.1考虑横风向振动的风荷载 图 3.1 流场中的横流截面 Fig 3.1 The lateral section in flow-field 结构沿高度Z方向作用在结构单位长度上的横风向荷载主要来自于升力,其次来自于阻力。高度z处单位长度上的风荷载 式中,为来流与结构的夹角,称…

南宁网站建设及推广招商网站如何做推广

nfs局域网共享网盘配置 服务器端(以ubuntu为例)第一步:安装 NFS 服务器第二步:创建共享目录第三步:配置 NFS 导出第四步:应用配置第五步:配置防火墙第六步:验证配置 客户端&#xff…

自己做的网站百度搜到国家大事新闻近三天

from:http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed命令上,今天不总结一下都对不起昨天流逝的时间啊~~~ 用sed命令在行首或行尾添加字符的命令有以下几种&…

做网站谁家做的好温州seo博客

视频如何提取文字?你用过哪些视频提取工具?视频转文字工具,又称为语音识别软件,是一款能够将视频中的语音或对话转化为文字的实用工具。它运用了尖端的声音识别和语言理解技术,能精准地捕捉视频中的音频,并…

简述企业网站建设的目的做的最好的微电影网站有哪些

目录 前言阅读对象阅读导航前置知识笔记正文一、单体服务介绍二、服务拆分三、分布式微服务升级前的思考3.1 关于SpringBoot/SpringCloud的思考【有点门槛】 四、SpringCloud升级整合4.1 新建父子项目 学习总结感谢 前言 从本节课开始,我将自己手写一个基于SpringC…

肇庆关键词网站排名重庆网站怎么设置

使用Dapr 编写的是一个多进程的程序, 两个进程之间依赖于启动顺序来组成父子进程,使用Visual Studio 调试起来可能会比较困难,因为 Visual Studio 默认只会把你当前设置的启动项目的启动调试。好在有Visual Studio 扩展(Microsoft Child Proc…

设计素材网站照片徐州关键字优化资讯

工作中难免会遇到并不“完美”的需求文档,比如牵一发而动全身却不清晰的交互逻辑、子条目频繁的变更、交流缺失导致的歧义等,都会让测试在项目推进中手足无措。 一份好的需求文档,不止能够加速开发和测试的脚步,还能够提前发现风…

咸宁响应式网站建设价格学校网页网站模板

转载自 Java IO: Reader And Writer译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStream和OutputStream非常类似。他们被用于读写文本。InputStream和OutputStream是基于字节的&am…

php网站的优势免费建网站软件下载手机

DOM- 节点操作 一.节点操作 1.DOM节点 目标:能说出DOM节点的类型 DOM节点 DOM树里每一个内容都称之为节点 节点类型 元素节点 所有的标签 比如 body、 div html 是根节点 属性节点 所有的属性 比如 href 文本节点 所有的文本 document树: 总结&…

域名备案和网站备案有什么不同wordpress sahifa主题

简介: 随着人工智能应用在全球范围的普及和风靡,大语言模型技术(Large Language Model,简称 LLM)受到了广泛的关注和应用。而图数据库作为一种处理复杂数据结构的工具,能够为企业构建行业大语言模型提供强大…

可以充值的网站怎么做wordpress副标题怎么写

昨天不该早点走的.... 首先操作限制实际上是一个回文限制 每个$b[i] - b[i - 1]$互不干扰,不妨设这个串关于中心点对称的这么一对区间的串分别为$(S_1, S_2)$ 题目的限制相当与存在$(T_1, T_2)$使得$T_1 inv(S_2) \;and\;T_2 inv(S_1)$ 考虑一对串$(S_1, S_2)$被计…