【MongoDB】java操作MangoDB,实现时间搜索条件,解决ISODate的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013781343/article/details/80697150

因为在做项目时,需要使用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<Document> iterable = collection.find(ageObj);
		
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
	Document user = cursor.next();
	String jsonString = user.toJson();
	Map<String, Object> jsonStrToMap = jsonStrToMap(jsonString);
	list.add(jsonStrToMap);
}

如果转换为MongoDB指令  也就是  db.java.find({"age":{"$gt":24}})  这个样子

这里的$gt 代表的含义见下表

$gt>
$gte>=
$eq: =
$ne!=
$lt<
$lte<=
$in in(后面的值为bson对象数组)
$ninnot 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 ));
然后就可以实现筛选介于两个时间点内的数据了!


阅读更多
换一批

没有更多推荐了,返回首页