2015-08-21 253 views
1

我有一個集合預訂。這裏面收集我已經得到了調試一個文件:MongoDB - 檢查日期範圍A是否與其他日期範圍重疊b

{ 
"_id": ObjectID("55d7608120b345d2cc7c9f45"), 
"name": "booking1", 
"start": ISODate("2015-01-10T00:00:00.000Z"), 
"end": ISODate("2015-01-20T00:00:00.000Z")} 

現在我有第二個日期範圍,要檢查如果日期範圍乙方在預訂文件之一重疊。

我的查詢是:

db.booking.find({$or:[{"start":{$gt:ISODate("2015-01-15T00:00:00.000Z")}},{"end":{$lt:ISODate("2015-01-25T00:00:00.000Z")}}]}); 

當我執行它有時我得到的結果,當我在查詢更改日期我沒有得到任何結果。這不是邏輯!我不知道查詢是否正確,或者我應該改變策略。

我的應用程序是一個Node + JS + Express + MongoClient環境。

我希望答案, 謝謝所有問候語DroidSheep

回答

0

這樣如何查詢?

db.booking.find({ $or: [ 
    { start : { $lte: ISODate("2015-01-15T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-15T00:00:00.000Z") } }, 
    { start : { $lte: ISODate("2015-01-25T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-25T00:00:00.000Z") } }, 
    { start : { $gt: ISODate("2015-01-15T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-25T00:00:00.000Z") } } 
]}); 

它檢查日期範圍B的開始是被查詢的文件的日期範圍內,或日期範圍B的端部是被查詢的文件的日期範圍內,或在該日期範圍B之前開始和之後的結束查詢文檔日期範圍。

+0

有一刻我會嘗試它! :-)在第一眼看起來很好 – DroidSheep

+0

我已更新查詢,以便匹配是包含性的,即如果日期範圍B剛好在查詢文檔日期範圍的末尾開始,則匹配。這是否會帶來預期的結果? – sheilak

+0

到目前爲止的一個問題它是如何在MySql中? – DroidSheep

0

我已經試過了它看起來不錯,但是當我執行此查詢:

{ $or: [ 
    { start : { $lte: ISODate("2015-01-5T00:00:00.000Z") }, end : { $gt: ISODate("2015-01-5T00:00:00.000Z") } }, 
    { start : { $lt: ISODate("2015-01-10T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-10T00:00:00.000Z") } }, 
    { start : { $gt: ISODate("2015-01-5T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-10T00:00:00.000Z") } } 
]} 

蒙戈不符合我的文檔響應。我已經嘗試了多種解決方案,但mongo沒有向我顯示該文檔!但是,謝謝你的第一個問題sheilak。問候DroidSheep

編輯:我的文檔:

{ 
    "_id": ObjectID("55d78c3720b345d2cc7c9f49"), 
    "name": "test_booking", 
    "start": ISODate("2015-01-10T00:00:00.000Z"), 
    "end": ISODate("2015-01-20T00:00:00.000Z") 
} 

編輯編輯: 我不喜歡這樣的解決方法:

{ $or: [ 
    { start : { $lte: ISODate("2015-01-01T00:00:00.000Z") }, end : { $gt: ISODate("2015-01-01T00:00:00.000Z") } }, 
    { start : { $lt: ISODate("2015-01-10T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-10T00:00:00.000Z") } }, 
    { start : { $gt: ISODate("2015-01-01T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-10T00:00:00.000Z") } }, 
    { start : ISODate("2015-01-10T00:00:00.000Z")}, 
    { end : ISODate("2015-01-01T00:00:00.000Z")} 
]} 

是不是?你能檢查一下嗎?問候DroidSheep

+0

是的,看起來它可以完成這項工作。您可以通過刪除最後兩個條件來簡化它,並在之前的條件中將$ gt更改爲$ gte,將$ lt更改爲$ lte。 – sheilak

+0

謝謝你以後我會試試看! – DroidSheep