2015-02-11 79 views
0

業務案例:我不想在一天中的一小時內(例如下班時間)檢索不想被檢索的用戶。按時鐘範圍查詢mongo文檔 - 正向和反向

在接近這個

{ 
    'name': String, 
    'from': Number, // 800 (8:00 AM) 
    'to': Number, // 1700 (5:00 PM) 
    ... 
} 

的模式我使用的聚合來獲取用戶,同時還進行其它操作展開子文檔陣列。基本搜索標準在$match運營商是這樣的。

User.aggregate([ 
    { 
    // some aggregation stuff 
    }, 
    { 
    $match: { 
     $and: [ 
     { 'from': { $lte: currentTime }, 
     { 'to': { $gte: currentTime } 
     ] 
    } 
    } 
]); 

問題: 我怎樣才能讓用戶設置反向範圍?像8PM到8AM一樣。我如何編寫一個可以幫助解決這個問題的查詢?今天沒有留下任何頭髮。

回答

1

對於「正常」範圍等上午9點到下午5時,查詢條件是

{ "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } } 

$and是不必要的,因爲它是隱含的),而「反向」範圍等晚上8點至上午08點,查詢條件是

{ "$match" : { "$or" : [{ "from" : { "$gte" : ct } }, { "to" : { "$lte" : ct } }] } } 

的邏輯是對於兩種類型的範圍不同,所以你應該添加新的字段爲反向的範圍:

{ 
    "name" : "Jerry", 
    "rfrom" : 2000, 
    "rto" : 800 
} 

,然後要麼做聚合,用火柴

{ "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } } 

{ "$match" : { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] } } 

或兩個$match條件的脫節一個聚集:

{ "$match" : { "$or" : [ 
    { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } }, 
    { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] } 
] } } 

另外,還有可能存在一個聰明的方式來存儲你的時間範圍這將在一個查詢中適用於「正常」和「反向」範圍,但是我在5分鐘內想不起來。