如何在MongoDB中建模和查询办公时间(日期,时区,dst)

时间:2015-12-30 21:16:49

标签: javascript mongodb timezone momentjs

每周办公时间:周一,周三,周五上午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。谢谢你的帮助!

麦克

1 个答案:

答案 0 :(得分:1)

您的模型中唯一缺少的是时区标识符,例如America/New_YorkAsia/Tokyo - 假设每个人可能位于不同的时区。如果他们都在同一时区,那么您只需要知道应用程序逻辑中的时区。

但是,这不会帮助您查询。为此,您必须将每个出现投影到一组基于UTC的日期+时间值。总是需要权衡。如果您的人数相对较少,您可以只加载它们,然后根据规则测试当前日期。

如果您有很多人,那么您肯定需要定期对每个事件进行投影,这样您就可以针对当前的UTC时间进行简单的范围查询,以查看谁是开放的。