mongoDb根据时间间隔返回结果

时间:2013-09-07 16:31:08

标签: mongodb

我有这个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吗?

3 个答案:

答案 0 :(得分: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
            });

答案 1 :(得分:1)

您需要遵循这一基本逻辑(here's更长的解释和一些链接)。您的示例数据不包括与所选范围完全重叠的房间进/出日期,因此我在此处介绍。

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") }

答案 2 :(得分: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')}})