文档章节

mongodb数据库$and引起的代码重构

 人生的算法
发布于 2017/03/03 19:42
字数 494
阅读 11
收藏 0

实际工作中,查询是很常见的操作,下面就是我项目中遇到的一个业务需求,根据两个字段进行区间查询,这里后台会接收四个输入条件,以完成查询操作;

因为有两个字段需要查,我就提取了公共代码.

方法参数需要query:查询对象;数据库检索字段;查询开始时间,查询结束时间;
因为有两个区间条件,就有三种情况:
    public static Query filterSearchTime(Query query,String searchField,Date startTime,Date endTime){    
        Criteria cr = new Criteria();
        // 1 同时存在;
        if(!DateUtils.isNullOrEmpty(startTime) && !DateUtils.isNullOrEmpty(endTime)){
            Criteria criteria = new Criteria();
            Criteria condition1 = Criteria.where(searchField).gte(startTime);
            Criteria condition2 = Criteria.where(searchField).lte(endTime);
            query.addCriteria(criteria.andOperator(condition1, condition2));
        //    2 区间开始时间存在;
        } else if(!DateUtils.isNullOrEmpty(startTime)){
            query.addCriteria(Criteria.where(searchField).gte(startTime));
        //    3 区间结束时间存在;
        } else if(!DateUtils.isNullOrEmpty(endTime)){
            query.addCriteria(Criteria.where(searchField).lte(endTime));
        }
    }

正常mysql数据库,多个and可以连用,但是在mongodb中,一个query中只能有一个and,所以也就决定这个方法只能用一次,要是两个连续的查询,就会报and符重复的错误:

Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'null' criteria. Query already contains... ;


但是转换一下思路,问题就迎刃而解;
我这里分三个if判断的情况,根本目的就是判断这个条件是否存在,所以当条件存在时,我把条件和语句放到list里;当第二个也存在时,我也放进去,这样就成功的把三个判断,简化成两个判断,是否同时满足已经不是我关注的事情了;
这样还有一个好处,我现在只返回list,你多少条件同时要and操作,只要我遍历list就行,成功优化了代码,规避了mongodb的and的局限;    
    public static List<Criteria> filterSearchTime(String searchField,Date startTime,Date endTime){
        List<Criteria> operator = new ArrayList<Criteria>();
        if(!DateUtils.isNullOrEmpty(startTime)){
            operator.add(Criteria.where(searchField).gte(startTime));
        }
        if(!DateUtils.isNullOrEmpty(endTime)){
            operator.add(Criteria.where(searchField).lte(endTime));
        }
        return operator;
    }

© 著作权归作者所有

粉丝 0
博文 2
码字总数 679
作品 0
昌平
私信 提问
基于MySQLMTOP的天兔(Lepus)数据库监控系统V3.0正式发布

天兔(Lepus)数据库监控系统V3.0正式发布 Lepus是一个由Python+PHP开发的数据库企业级监控系统,是作者继MYSQLMTOP开源监控系统(www.mtop.cc)之后,进行了代码重构,重新开发的一套企业系统。...

andrew_ru
2014/08/29
2.2K
0
pyAggr3g470r 3.8 发布,新闻聚合器

pyAggr3g470r 3.8 重构了管理页面,可在这个页面中修改用户名和密码;改进了 HTML 导出;实现完全基于 MongoDB 的全文搜索,提供更快的搜索速度。 pyAggr3g470r 是一个用 Python 开发的多线程...

oschina
2013/01/14
601
0
mongodb 迁移到mysql 求助?

接手别人的网站项目,之前是nodejs + mongodb 开发的 现在想要用java + mysql 重构。 网站是文章类型的,第一步想要把mongodb里的数据导入到mysql 我对mongodb不了解,之前项目人员也没有留下...

肖申克救赎
2017/08/04
245
5
MySQL Cluster 与 MongoDB 复制群集分片设计及原理

分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求 分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL...

微笑向暖wx
01/26
30
0
SequoiaDB 关于 MongoDB 安全事件的一些思考

刚刚过去的这个周末,各位大数据和数据库从业者想必是被MongoDB的“安全事件”给刷屏了,MongoDB作为当前NoSQL在全球的领军人物,遭到这么大规模的黑客攻击,这也再次让我们对于新一代的开源...

巨杉数据库
2017/01/09
2.7K
5

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
43分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
119
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部