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

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

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 に答える