我使用弹簧数据和mongodb来创建应用程序。弹簧数据mongodb日期范围查询
我有这样的对象:
public class Room {
private String name;
private List<Date> occupied;
}
我想用mongodbTemplate
最好让未占用日期范围房间的列表。
因此,例如,如果我有一个开始日期10/10/2014和结束日期15/10/2014我想获得列表中没有的房间列表占据日期10,11,12, 2014年10月13,14,15。
有没有人有这方面的想法?
更新:
我已经找到一种方法,通过使用该查询做到这一点:
query.addCriteria(Criteria.where("occupiedDates")
.ne(from).andOperator(
Criteria.where("occupiedDates").ne(to))
);
的问题是,我不能动态添加andOperator。
如果可能,我宁愿在标准内添加日期列表。
一个实例文档(只有一个记录在蒙戈存在这一个):
间(bedcount = 1,bedtype1 = 1,bedtype2 = 0,bedtype3 = 0,bedtype4 = 0,
文件类型= NULL,noofrooms = 0,占用= 0,照片= NULL,rateid = 1,
ROOMNAME = NULL,roomno = 888,状态= NULL,
roomTypeID = 26060747427845848211948325568,occupiedDates = [太阳08月10
00:00 :00 EEST 2014,8月1日星期一00:00:00 EEST 2014,8月12日星期二00:00:00
EEST 2014,Wed Aug 13 00:00:00 EEST 2014],属性= {})
这是的wyeru是如何构建的代码:
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
Date to = null;
Date from = null;
try {
to = dateFormat.parse("12-08-2014 00:00:00");
from = dateFormat.parse("10-08-2014 00:00:00");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DBObject c1 = new BasicDBObject("occupied", null);
DBObject c2 = BasicDBObjectBuilder.start()
.push("occupied").push("$not")
.push("$elemMatch").add("$gte", from).add("$lte", to).get();
Criteria c = Criteria.where("$or").is(Arrays.asList(c1, c2));
Query query = new Query().addCriteria(c);
List<Room> rooms = mongoTemplate.find(query, Room.class);
该查询被发送到的MongoDB
{ "$or" : [
{ "occupied" : null } ,
{ "occupied" :
{ "$not" :
{ "$elemMatch" :
{ "$gte" : { "$date" : "2014-08-09T21:00:00.000Z"} ,
"$lte" : { "$date" : "2014-08-11T21:00:00.000Z"}
}
}
}
}
]}
由此我们了解到查询应该不会返回任何内容。但它返回给我1行。
这不是一个直接的答案,但你为什么不先阅读文档: http://docs.spring.io/spring-data/mongodb/docs/1.3.x/reference/html/mongo.repositories.html这真的很有帮助,并会解决您的问题。 – 2014-10-03 09:43:41
当然,我已阅读文档,我找不到溶剂,否则我不会问:) – giannisapi 2014-10-03 09:50:31
@帕特里克,谢谢你的好编辑:) – giannisapi 2015-06-09 06:41:28