0

我正在尝试建立一个小型网站,人们可以在其中预订用户进行为期一天的演出。我正在使用来自流星的帐户包,我的计划是附上以下内容:

user.availability: [ 
                     {   
                       status: n, //where n is 0-# of status types (5 atm) : single char rather than float   
                       date: ddmmyyy, //string as well, no need for time as its day long   
                       job_id: {Job} 
                     }, ... 
                   ]

Job 只拥有诸如何地、何地、何时之类的信息。

有 5 种状态:中立、可用、明确不可用、已预订、保留。用户自然是中立的,并且必须明确说明可用性。他们在前三个状态之间进行选择:n、a、u,并且只允许在未来两周内设置最大可用性。工作“提供者”是设置其他两种可用性状态的人。对我来说,中立状态意味着他们不需要数据库中的记录(user.availability 数组)。

这种风格让我可以进行以下查询:

db.users.find({ availability: { status: 'a', date: { $in: search_dates_array }});

当用户登录/访问该站点时,我可以擦除他们在当前日期之前的日期的任何可用性设置。非活动用户的修剪间隔要长得多。

我认为这个解决方案是有益的,因为它存储的信息量最少,需要很少的维护,可以由特定事件触发,并且易于查询。但我不能 100% 确定这是否是利用 mongodb 优势的正确方法。我将不胜感激,如果有人能指出我(相对)容易消化的关于优化 mongodb 模式的文章,那就太棒了。

谢谢你。

4

1 回答 1

1

我会为可用性创建一个单独的集合。如果您使用 MomentJS 作为日期,您可以将它们以人类可读的形式存储,并且它们很容易搜索/排序。扩展用户集合并不总是最好的主意,尤其是当您的子元素是需要查询和过滤的数据数组时。

您可以使用 fullcalendar 包来显示(全天)事件 - 它会为您做很多工作,能够根据需要显示月/周/日视图,并且您可以根据需要对预订进行颜色编码。https://atmospherejs.com/fullcalendar/fullcalendar

于 2016-12-02T22:53:37.927 回答