Java使用MongoTemplate操作MangoDB,实现根据时间等条件组合查询日期范围

Java和Mongo中的Date比较

Java中的Date:"createTime" : ("2023-12-05T16:48:23.417")
MongoDB中的Date: "createTime" : ISODate("2023-12-05T08:48:23.417Z")

MongoDB中的日期格式 是 UTC 通用标准,以z来标识,格式为yyyy-MM-dd HH:mm:ss.000Z
该时间比中国北京时间晚了8个小时,即ISODate("2023-12-05T08:48:23.417Z")相当于北京时间2023-12-05T16:48:23.417

因为mongo中的Date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者正好相差8个小时。

包含日期字段实体类的封装

Book one = mongoTemplate.findOne(new Query(Criteria.where("_id").is("656ee3d7adffe6129d82cd1e")), Book.class);
System.out.println(one);

在这里插入图片描述
mongoTemplate查询时自动转为中国北京时间。

日期范围查找(查找更新时间在2023-12-05,17点之前的图书)

Book one = mongoTemplate.findOne(new Query(Criteria.where("updateTime").lte(LocalDateTime.of(2023,12,5,17,0))), Book.class);
System.out.println(one);

在这里插入图片描述

db.getCollection('book').find({updateTime:{$lte:ISODate("2023-12-05T09:00:00.000Z")}})

Java使用MongoTemplate操作MangoDB,实现根据时间等条件组合查询日期范围_第1张图片
mongo中的Date类型比中国北京时间晚了8个小时,所以17-8=9查找内容为ISODate("2023-12-05T09:00:00.000Z")

以下为错误示范,这相当于查的是北京时间2023年12月6日01时之前的数据

db.getCollection('book').find({updateTime:{$lte:ISODate("2023-12-05T17:00:00.000Z")}})

Java使用MongoTemplate操作MangoDB,实现根据时间等条件组合查询日期范围_第2张图片

MongoDB条件表达式

表达式 含义
$gt >
$gte >=
$eq =
$ne !=
$lt <
$lte <=
$in in(后面的值为bson对象数组)
$nin not in(后面的值为bson对象数组)

实现方式1:

Query query = new Query(Criteria.where("updateTime").lte(LocalDateTime.now()).gte(LocalDateTime.now().minusMonths(5)));
Book book = mongoTemplate.findOne(query, Book.class);

实现方式2:

BasicDBObject query = new BasicDBObject();
BasicDBObject basicDbObject = new BasicDBObject();
LocalDateTime startTime = LocalDateTime.now();
basicDbObject.append("$lte", startTime);
basicDbObject.append("$gte", startTime.minusMonths(5));
query.put("updateTime", basicDbObject);
long countDocuments = mongoTemplate.getCollection("book").countDocuments(query);
System.out.println(countDocuments);

实现方式3:

BasicDBObject gt = new BasicDBObject("$gt",24);
BasicDBObject queryObject = new BasicDBObject("age",gt);

这个BasicDBObject 类就是bson jar包的类,这里的条件拼接出来就是下面这个格式
{"age":{"$gt":24}}
如果转换为MongoDB指令 也就是db.java.find({"age":{"$gt":24}})

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("updateTime",new BasicDBObject("$gte",new Date(startYear - 1900, startMonth - 1, startDay)));
BasicDBObject ageObjEnd = new BasicDBObject("updateTime",new BasicDBObject("$lte",new Date(endYear - 1900, endMonth - 1, endDay)));
BasicDBObject andObj = new BasicDBObject("$and",Arrays.asList(ageObjStart ,ageObjEnd ));

然后就可以实现筛选介于两个时间点内的数据了!

你可能感兴趣的:(MongoDB,java,mongodb)