每周办公时间:周一,周三,周五上午10点〜上午11点45分
我想追踪一群人的办公时间。当他们的小时开始时,我想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' });
我非常讨厌时区和dst。谢谢你的帮助!
麦克
答案 0 :(得分:1)
您的模型中唯一缺少的是时区标识符,例如America/New_York
或Asia/Tokyo
- 假设每个人可能位于不同的时区。如果他们都在同一时区,那么您只需要知道应用程序逻辑中的时区。
但是,这不会帮助您查询。为此,您必须将每个出现投影到一组基于UTC的日期+时间值。总是需要权衡。如果您的人数相对较少,您可以只加载它们,然后根据规则测试当前日期。
如果您有很多人,那么您肯定需要定期对每个事件进行投影,这样您就可以针对当前的UTC时间进行简单的范围查询,以查看谁是开放的。