如何建模和查询 MongoDB 中的办公时间(日期、时区、夏令时)

How to model and query Office Hours in MongoDB (dates, timezones, dst)

每周办公时间:周一、周三、周五 10am->11:45am

我想跟踪一群人的办公时间。当他们的时间开始时,我想 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' });

我非常讨厌时区和夏令时。感谢您的帮助!

麦克

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

但是,这不会帮助您查询。为此,您必须将每个 occurrence 投影到一组 UTC-based 日期+时间值。总有一个权衡。如果人比较少,可以全部加载,然后根据规则测试当前日期。

如果人多的话,肯定需要周期性地预测每次出现的情况,这样就可以针对当前的UTC时间做一个简单的范围查询,看看谁有空。