mongodb 中,使用这样的数据结构描述甘特图:
[
{ person: "nameA", task: "taskA", from: Date('xxxx'), to: Date('yyyyy')},
{ person: "nameA", task: "taskB", from: Date('xxxx'), to: Date('yyyyy')},
{ person: "nameB", task: "taskA", from: Date('xxxx'), to: Date('yyyyy')},
...
]
代表 person 在 from 到 to 的时间段做 task 。
有一个约束条件是,person 在同一个时间段( from - to )不能同时在做两个不同的 task 。例如,在某个时间段,nameA 不能同时即在做 taskA,又在做 taskB 。
因此,在插入或者修改数据的时候,可以简单的通过下面的语句检测数据库中已经是否有冲突记录
model.findOne({ person: 'xxxx', task: 'yyyy', to: { $gte: newFrom }, from: { $lte: newEnd } })
存在一个场景,person 比如因为请假或者什么其他原因,从时间 t 开始,他的所有任务都往后移动一天。可以这样更新:
model.updateMany({ person: 'xxxx', from: { $gte: Date('tttt') }, { $set: { from: { $add: 86400000 } }, { to: { $add: 86400000 } } })
但是这样是没有检查上面说的约束条件的。应该怎么做呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.