0

我有这个 mongodb json 数据:

{'room' : '1', 'book_in_date' : '2013/09/11', 'book_out_date' : '2013/09/12'}
{'room' : '1', 'book_in_date' : '2013/09/15', 'book_out_date' : '2013/09/17'}
{'room' : '2', 'book_in_date' : '2013/09/11', 'book_out_date' : '2013/09/13'}
{'room' : '3', 'book_in_date' : '2013/09/20', 'book_out_date' : '2013/09/22'}
{'room' : '4', 'book_in_date' : '2013/09/09', 'book_out_date' : '2013/09/10'}

我想要实现的是获取与此时间间隔冲突的所有房间:

book_in_date = 2013/09/11
book_out_date = 2013/09/13

在上面的数据示例中,结果将是:room1(第一条记录),room2。

这在mongodb中可能吗?

4

3 回答 3

1

是的,它是可能的,您的查询将如下所示:

rooms.find({ $or [{ book_in_date: { $gte: yourBookInDate }, 
                    book_out_date: { $lte: yourBookOutDate }},
                  { book_in_date: { $lte: yourBookOutDate }, 
                    book_out_date: { $gte: yourBookOutDate }}
                  { book_in_date: { $lte: yourBookInDate }, 
                    book_out_date: { $gte: yourBookInDate }}]
            }).toArray(function(err, result) {
                   //process result
            });
于 2013-09-07T17:12:20.580 回答
1

您需要遵循这个基本逻辑(这里有更长的解释和一些链接)。您的示例数据未涵盖与所选范围完全重叠的房间入住/退房日期,因此我将在此处进行介绍。

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") }
于 2013-09-07T19:17:39.337 回答
0

下面的查询将返回所需的结果:

db.library.find({'book_in_date' : {$gte:new ISODate('2013-09-11T00:00:00.000Z')},'book_out_date' : {$lte: new ISODate('2013-09-13T00:00:00.000Z')}})
于 2013-09-07T18:03:52.260 回答