2015-12-30 64 views
0

每週辦公時間查詢營業時間:星期一,三,五上午10:00-> 11:45如何建模和MongoDB中(日期,時區,DST)

我想跟蹤辦公時間內的人的集合。當他們的小時開始時,我想setSign('open')。當它們結束時,setSign('closed')

該模型明顯打破。如何在尊重MongoDB中的時區的情況下進行建模和查詢是一個問題。

people.find({}); 
[{ 
    name: 'hank', 
    days: [1,3,5], // mon,wed,fri 
    start: '08:00', 
    end: '17:00, 
    lastSign: 'new', 
}] 

所以,每次5分鐘,我運行一個查詢:

var hoursNowOpen = people.find({ 
    lastSign: { $ne: 'open' }, 
    ???? 
}); 

// Set to open 
hoursNowOpen.forEach(function(person) { person.setSign('open');}); 

// Mark we set the sign to open 
var ids = hoursNowOpen.map(function(person) { return person._id;}); 
people.update({_id: {$in: ids}}, { lastSign: 'open' }); 

我恨時區和夏令這麼多。謝謝你的幫助!

邁克

回答

1

從模型中唯一缺少的是一個時間區標識符,如America/New_York,或Asia/Tokyo - 假設每個人都可能在不同的時區。如果他們都在同一個時區,那麼你只需要知道你的應用程序邏輯中的時區。

但是,這不會幫助你查詢。爲此,您必須將每個出現次數設置爲一組基於UTC的日期+時間值。總是有一個權衡。如果您的人數相對較少,則可以將它們全部加載,然後根據規則測試當前日期。

如果您有很多人,那麼您肯定需要定期對每個事件進行投影,以便您可以對當前UTC時間進行簡單的範圍查詢以查看誰打開。