2017-09-16 28 views
0

我想查找當前時間落在文檔的startour和endhour之間的所有文檔。我爲小時和分鐘設置了不同的字段。 我的架構查找所有文檔starthour和startminute之間的文檔starthour和endhour

const mySchema = new Schema({ 
    startHour: { type: Number}, 
    endHour: { type: Number}, 
    startMinute: { type: Number}, 
    endMinute: { type: Number} 
}) 

我已經寫了下面這是不工作的查找查詢。這裏小時值和分鐘值從HTTP查詢來我已經轉換他們使用的查詢

find({ 
    $and : [ 
       { $or: [{starthour : { $lt: hour}}, 
        { $and : [ {starthour: { $eq : hour}}, {startMinute: { $gt: minute}}]} 
       ]}, 
       { $or: [{endHour : { $gt: nsh}}, 
        { $and : [ {endhour: { $eq : hour}}, {endMinute: { $gt: minute}}]} 
       ]}, 
      ], 
     }) 

這將返回所有在哪裏(小時比starthour和endhour大於和小於)或文檔之前爲int(如果開始時間或結束時間等於小於開始分鐘的時間應大於分鐘)。

+0

爲什麼不讓生活變得更容易,並簡單地表達「開始」和「結束」是從「一天中的幾分鐘」開始。每個小時有60分鐘,因此從上午8:00到下午5:00將是「開始:480,結束:1020」。然後,您只需在查詢中表示您的「當前分鐘數」,看看是否落在文檔範圍之間。比試圖在單獨的領域中玩弄小時和分鐘要容易得多。並且使用更少的存儲空間。 –

+0

這是一個不錯的選擇。謝謝!! –

回答

0

的這裏的邏輯是:

  1. 檢查您小時等於endHour與否,如果不設置 isMinMatch如此。
  2. 如果不相等,那麼檢查一下,確保你的分鐘不大於你endMinute。
  3. 然後確保你的工作時間在開始和結束時間之間,isMinMatch爲true。
  4. 從結果中刪除isMinMatch。

所以我使用mongo聚合來實現這一點。

var hour = 11; 
var minute = 0; 
db.getCollection('testHours').aggregate([ 
{ $addFields: { 
    isMinMatch : { 
     $cond : [{ $eq : [ "$endHour", hour ] } , { $gte : [ "$endMinute" , minute] }, true ] 
    } 
    } 
}, 
{$match: {startHour : { $lte: hour}, endHour : { $gte: hour}, isMinMatch: true } }, 
{ $project : { isMinMatch: 0 } } 
]) 
+0

可以說時間小時值是19,分鐘是25,開始時間是15:00,結束時間是20:00。在這種情況下,最後一個條件{endMinute:{$ gte:minute})將失敗。這就是爲什麼我要單獨檢查LT和EQ情況。 –

+0

現在更新我的答案,請再次檢查。 –