您需要遵循这个基本逻辑(这里有更长的解释和一些链接)。您的示例数据未涵盖与所选范围完全重叠的房间入住/退房日期,因此我将在此处进行介绍。
start1 <= end2 AND start2 <= end1
在你的情况下:
book_in_date <= room_end_date AND room_start_date <= book_out_date
由于查询需要用到房间数据,所以第一个条件需要稍微翻转一下:
room_out_date => 2013/09/11 AND room_in_date <= 2013/09/13
(但是,你用过book_start/out_date
,所以,真的如下图)
所以,这被翻译成:
rooms.find({ $and: [
{ book_out_date : { $gte : ISODate("2013-09-11") } },
{ book_in_date : { $lte : ISODate("2013-09-13") } }
]);
测试
鉴于此数据:
{ "room" : "1", "book_in_date" : ISODate("2013-09-07T00:00:00Z"), "book_out_date" : ISODate("2013-09-08T00:00:00Z") }
{ "room" : "1", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-12T00:00:00Z") }
{ "room" : "2", "book_in_date" : ISODate("2013-09-15T00:00:00Z"), "book_out_date" : ISODate("2013-09-17T00:00:00Z") }
{ "room" : "3", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-13T00:00:00Z") }
{ "room" : "4", "book_in_date" : ISODate("2013-09-20T00:00:00Z"), "book_out_date" : ISODate("2013-09-22T00:00:00Z") }
{ "room" : "5", "book_in_date" : ISODate("2013-09-09T00:00:00Z"), "book_out_date" : ISODate("2013-09-10T00:00:00Z") }
这个查询:
> db.interval.find(
{$and: [
{ book_out_date: { $gte: ISODate('2013-09-09')}},
{book_in_date: { $lte: ISODate('2013-09-11')}}]} )
结果:
{ "room" : "1", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-12T00:00:00Z") }
{ "room" : "3", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-13T00:00:00Z") }
{ "room" : "5", "book_in_date" : ISODate("2013-09-09T00:00:00Z"), "book_out_date" : ISODate("2013-09-10T00:00:00Z") }
其他:
> db.interval.find({$and: [ { book_out_date: { $gte: ISODate('2013-09-01')}}, {book_in_date: { $lte: ISODate('2013-09-19')}}]} )
结果:
{ "room" : "1", "book_in_date" : ISODate("2013-09-07T00:00:00Z"), "book_out_date" : ISODate("2013-09-08T00:00:00Z") }
{ "room" : "1", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-12T00:00:00Z") }
{ "room" : "2", "book_in_date" : ISODate("2013-09-15T00:00:00Z"), "book_out_date" : ISODate("2013-09-17T00:00:00Z") }
{ "room" : "3", "book_in_date" : ISODate("2013-09-11T00:00:00Z"), "book_out_date" : ISODate("2013-09-13T00:00:00Z") }
{ "room" : "5", "book_in_date" : ISODate("2013-09-09T00:00:00Z"), "book_out_date" : ISODate("2013-09-10T00:00:00Z") }
其他:
> db.interval.find({$and: [ { book_out_date: { $gte: ISODate('2013-09-22')}}, {book_in_date: { $lte: ISODate('2013-09-24')}}]} )
结果:
{ "room" : "4", "book_in_date" : ISODate("2013-09-20T00:00:00Z"), "book_out_date" : ISODate("2013-09-22T00:00:00Z") }