MongoDB 具有多个日期的对象的 squema 设计
MongoDB squema design for objects with several dates
我正在建立一个活动网站。有 2 种类型的事件:
- 具有特定日期和时间的活动。例如,剧院演出可以在 1 月 10 日晚上 8 点、1 月 11 日晚上 8 点和 1 月 13 日晚上 7 点进行演出。
- 在几天内开放几个小时的事件。例如,博物馆的展览可以在 1 月 10 日至 1 月 30 日上午 10 点至下午 6 点开放。
我需要保存日期和时间以便我可以回答以下问题 questions/queries:
- 明天晚上 7 点到凌晨 12 点将举行哪些活动?
- 这个周末会发生哪些事件?
- 哪些活动即将结束? (距离最后一天不到一周)
如果我们没有事件类型 2,我们可能会遇到以下问题:
- 姓名
- 类别
- 日期:日期数组(每一天都在数组中)
但是因为我们有事件类型 2,所以它必须有所不同。我想拥有:
- 名字
- 类别
- dates:像 {"2015-01-10 09:00": "2015-01-10 18:00"} 这样的对象数组,具有每天的小时范围。
但我认为不可能用这个 squema 做一个查询来解决问题 1。我错了吗?
您将如何构建数据以便我回答这三个问题?
谢谢!
比我想象的要容易。
首先,在 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 }
});
我正在建立一个活动网站。有 2 种类型的事件:
- 具有特定日期和时间的活动。例如,剧院演出可以在 1 月 10 日晚上 8 点、1 月 11 日晚上 8 点和 1 月 13 日晚上 7 点进行演出。
- 在几天内开放几个小时的事件。例如,博物馆的展览可以在 1 月 10 日至 1 月 30 日上午 10 点至下午 6 点开放。
我需要保存日期和时间以便我可以回答以下问题 questions/queries:
- 明天晚上 7 点到凌晨 12 点将举行哪些活动?
- 这个周末会发生哪些事件?
- 哪些活动即将结束? (距离最后一天不到一周)
如果我们没有事件类型 2,我们可能会遇到以下问题:
- 姓名
- 类别
- 日期:日期数组(每一天都在数组中)
但是因为我们有事件类型 2,所以它必须有所不同。我想拥有:
- 名字
- 类别
- dates:像 {"2015-01-10 09:00": "2015-01-10 18:00"} 这样的对象数组,具有每天的小时范围。
但我认为不可能用这个 squema 做一个查询来解决问题 1。我错了吗?
您将如何构建数据以便我回答这三个问题?
谢谢!
比我想象的要容易。
首先,在 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 }
});