【发布时间】:2014-11-28 08:53:23
【问题描述】:
我正在使用带有 mongodb 的 spring 数据来创建应用程序。
我有这个对象:
public class Room {
private String name;
private List<Date> occupied;
}
我想最好使用mongodbTemplate 来获取某个日期范围内未被占用的房间列表。
例如,如果我的开始日期为 2014 年 10 月 10 日,结束日期为 2014 年 10 月 15 日,我想获取列表中没有占据日期 10、11、12、13 的房间列表,14,15 为 2014 年 10 月。
有人对此有任何想法吗?
更新:
我已经找到了一种使用此查询的方法:
query.addCriteria(Criteria.where("occupiedDates")
.ne(from).andOperator(
Criteria.where("occupiedDates").ne(to))
);
问题是我不能动态添加andOperator。
如果可能,我希望在条件内添加日期列表。
一个示例文档是(mongo这个只有一条记录):
房间(床数=1,床型1=1,床型2=0,床型3=0,床型4=0,
filetype=null, noofrooms=0, occupancy=0, photo=null, rateid=1,
房间名=null,房间号=888,状态=null,
roomTypeID=26060747427845848211948325568,占用日期=[8 月 10 日星期日
2014 年东部标准时间 00:00:00,8 月 11 日星期一 2014 年东部标准时间 00:00:00,8 月 12 日星期二 00:00:00
2014 年欧洲东部标准时间,2014 年 8 月 13 日星期三 00:00:00 EEST],属性={})
这是构建 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 行。
【问题讨论】:
-
这不是一个直接的答案,但你为什么不先阅读文档:docs.spring.io/spring-data/mongodb/docs/1.3.x/reference/html/… 这真的很有帮助,会解决你的问题。
-
当然我已经阅读了文档,但我找不到解决方案,否则我不会问:)
-
@Patrick,感谢您的精彩编辑 :)
标签: java mongodb spring-data