因为在做项目时,需要使用java操作MongoDB,通过筛选条件查找到需要的结果,故将其遇到的问题记录下来
首先 ,在使用条件搜索功能之前,因为我们的查找方法需要使用到BSON包中的方法,你需要引入BSON的jar包,如何引入jar包可以看 【MongoDB】java与MangoDB配合使用。
我们首先来看如何使用
其实搜索条件使用很简单,直接上代码
BasicDBObject gt = new BasicDBObject("$gt",24);
BasicDBObject queryObject = new BasicDBObject("age",gt);
这个BasicDBObject 类就是bson jar包的类,这里的条件拼接出来就是下面这个格式
{"age":{"$gt":24}}
//下面是简单的遍历,整体的代码可以在上面那篇文章找到
FindIterable iterable = collection.find(ageObj);
List
如果转换为MongoDB指令 也就是 db.java.find({"age":{"$gt":24}}) 这个样子
这里的$gt 代表的含义见下表
$gt | > |
$gte | >= |
$eq: | = |
$ne | != |
$lt | < |
$lte | <= |
$in | in(后面的值为bson对象数组) |
$nin | not in(后面的值为bson对象数组) |
这样看好像很简单,是不是,但是!我要做的是时间筛选,然后我就去看了MongoDB中文档里存的时间类型是ISODate ,也就是下面这个样子
ISODate("2017-04-20T00:00:00Z") 这是什么?怎么搜索?
这个日期格式 是 UTC 通用标准时,以z来标识
mongo中的时间与China系统时间相差了8个小时,
这是因为mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者正好相差8个小时。
所以长的很奇怪,那我搜索条件应该怎么拼接呢?通过一系列使用和搜索,我发现使用下面的代码就可以解决这个问题
int startYear=2011;
int startMonth=11;
int startDay=1;
BasicDBObject ageObj = new BasicDBObject("insertTime",new BasicDBObject("$gte",new Date(startYear - 1900, startMonth - 1, startDay)));
因为
BasicDBObject()这个构造函数会自动帮你把Date格式数据转换为 UTC通用标准时
注意:因为java.util.Date(year,month,day)这个构造函数中year是超出1900的年数,所以需要减去1900;month从0开始,所以需要减去1。
然后测试上面的代码,发现成功,日期可以筛选出来,如果我们需要是 日期大于2011-1-1 并且 小于 2012-12-12呢?
我们只需要做如下操作即可,参数自己替换
BasicDBObject ageObjStart = new BasicDBObject("inserted",new BasicDBObject("$gte",new Date(startYear - 1900, startMonth - 1, startDay)));
BasicDBObject ageObjEnd = new BasicDBObject("inserted",new BasicDBObject("$lte",new Date(endYear - 1900, endMonth - 1, endDay)));
BasicDBObject andObj = new BasicDBObject("$and",Arrays.asList(ageObjStart ,ageObjEnd ));
然后就可以实现筛选介于两个时间点内的数据了!