この基本的なロジックに従う必要があります (ここに長い説明といくつかのリンクがあります)。あなたの例のデータは、選択した範囲と完全に重なる入退室日をカバーしていないので、ここでカバーしています。
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") }