具有多个日期的对象的MongoDB架构设计

时间:2015-01-07 22:41:56

标签: mongodb

我正在建立一个活动网站。有两种类型的事件:

  1. 具有特定日期和时间的活动。例如,一场戏剧表演可于1月10日晚上8点,1月11日晚上8点和1月13日晚7点举行。
  2. 在几天内打开一系列小时的活动。例如,博物馆的展览可以在1月10日至1月30日上午10点至下午6点开放。
  3. 我需要保存日期和时间,以便我可以回答以下问题/疑问:

    1. 明天晚上7点到12点将会发生哪些事件?
    2. 本周末将会发生哪些事件?
    3. 哪些活动即将结束? (最后一天不到一周)
    4. 如果我们没有类型2的事件,我们可能会有以下squema:

      • 名称
      • 类别
      • 日期:一组日期(每天都在阵列上)

      但是因为我们有类型2的事件,它必须是不同的。我想过:

      • 名称
      • 类别
      • 日期:{“2015-01-10 09:00”:“2015-01-10 18:00”}等一系列对象,每天的小时数范围。

      但我认为用这个squema做一个查询来解决问题1是不可能的。我错了吗?

      您如何构建数据以便我可以回答这三个问题?

      谢谢!

1 个答案:

答案 0 :(得分:0)

这比我想象的容易。

首先,在MongoDB上,您不能将日期作为键。

模型是:

{
  "name" : "Bob Dylan",
  "category" : "Exhibition", 
  "dates" : [
    {
      "init" : ISODate("2015-01-08T08:00:00Z"),
      "end" : ISODate("2015-01-08T19:00:00Z") 
    },
    {
      "init" : ISODate("2015-01-09T08:00:00Z"),
      "end" : ISODate("2015-01-09T21:00:00Z")
    },
    {
      "init" : ISODate("2015-01-10T08:00:00Z"),
      "end" : ISODate("2015-01-10T21:00:00Z") 
    }
  ],
  "createdAt" : ISODate("2015-01-09T16:33:51.338Z")
}

查询是:

return Events.find({
    'dates.init' : { $gte: dateInit },
    'dates.end' : { $lte: dateEndPlusOneDay }
  });