我有这个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吗?
答案 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')}})