Javascript 使用新日期重复mongo文档
我正在使用Mongo DB为客户机创建事件日历。在面向公众的一面,用户将能够查看事件,并将它们添加到他们手机上的日历中,我正在使用手机。我遇到的问题是,每周的活动很少发生变化,如果它们发生变化的话,可能是教练的名字,或者是房间的变化。因此,在管理员端,当管理员创建一个事件时,他们将能够单击重复事件直到“X”日期。在服务器上,我需要重新创建文档,直到事件的开始时间或结束时间等于重现日期 我的事件架构如下所示:Javascript 使用新日期重复mongo文档,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正在使用Mongo DB为客户机创建事件日历。在面向公众的一面,用户将能够查看事件,并将它们添加到他们手机上的日历中,我正在使用手机。我遇到的问题是,每周的活动很少发生变化,如果它们发生变化的话,可能是教练的名字,或者是房间的变化。因此,在管理员端,当管理员创建一个事件时,他们将能够单击重复事件直到“X”日期。在服务器上,我需要重新创建文档,直到事件的开始时间或结束时间等于重现日期 我的事件架构如下所示: var activitySchema = mongoose.Schema({ "
var activitySchema = mongoose.Schema({
"room": String,
"type": String,
"title" : String,
"start": {type: Date},
"end": {type: Date},
"instructor" : String,
"desc": String,
"image": String,
"style": {
"backgroundColor": String
}
})
当用户点击创建表单上的submit时,将触发:
onSubmit() {
var startTime = {start: this.state.start || this.state.data};
var endTime = {end: this.state.end || this.state.data};
var color = {style: {backgroundColor: this.state.color || this.state.data}}
var image ={image: this.state.image || this.state.data};
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, startTime, endTime, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
},
所以我需要做的是,当他们点击submit时,它会一次又一次地重复文档,但是随着日期增加了7天,所以它会在每周的同一天重复
现在,它只是为选定的日期和时间一次创建一个事件,并显示在日历上。我正在使用MomentJS进行时间处理,我本来打算尝试使用MomentRecur,但安装时出现错误,但这似乎是一个尚未解决的常见问题
任何帮助或建议都会很棒,我不是一个后端人员,我不知道如何做到这一点 我们有非常相似的要求,最终使用了这个npm包: 这允许管理真实的iCal对象,这些对象由Outlook、Google calendar等典型日历应用程序识别。Is支持重复事件,因此您只需要一个具有重复定义的事件对象。 如果需要定期事件的发生,则有一个
getoccurrences()
函数。不幸的是,文档很少,单元测试是最好的开始
不过,在iCal、Outlook等领域,您可能需要重新考虑事件的数据模型。。。重复发生的事件只是一个事件,而不是多个
在客户端(web应用程序),我们使用了此服务:
https://www.addevent.com/
允许用户将重复事件添加到日历中。我们有非常类似的要求,最终使用了此npm包:
这允许管理真实的iCal对象,这些对象由Outlook、Google calendar等典型日历应用程序识别。Is支持重复事件,因此您只需要一个具有重复定义的事件对象。
如果需要定期事件的发生,则有一个getoccurrences()
函数。不幸的是,文档很少,单元测试是最好的开始
不过,在iCal、Outlook等领域,您可能需要重新考虑事件的数据模型。。。重复发生的事件只是一个事件,而不是多个
在客户端(web应用程序),我们使用了此服务:
https://www.addevent.com/
允许用户将重复事件添加到日历中。因此我最终解决了我的问题。虽然这可能不是重复事件的最佳方式,但这是我被告知要在我周围的多个人中做的事情
if(this.refs.repeatCheckbox.checked){
//let endRepeat = moment().endOf("month").format();
let endRepeat = moment(this.state.repeat).add({days: 1}).format();
let start = moment(this.state.start).format();
let end = moment(this.state.end).format();
do {
let newStart = {start: start};
let newEnd = {end: end};
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, newStart, newEnd, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
start = moment(start).add({days: 7}).format();
end = moment(end).add({days: 7}).format();
} while (end < endRepeat);
} else {
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, startTime, endTime, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
};
if(this.refs.repeatCheckbox.checked){
//让endRepeat=moment().endOf(“月”).format();
让endRepeat=矩(this.state.repeat).add({days:1}).format();
让开始=时刻(this.state.start).format();
让end=moment(this.state.end).format();
做{
让newStart={start:start};
设newEnd={end:end};
var myForm=this.refs.myForm.getValue();
var payload=u2;.merge(myForm、newStart、newEnd、color、image);
如果(有效载荷.\u id){
superagent.put(“http://“+this.context.config.API_SERVER+”/API/v1.0/activity/”).send(payload.end((err,res)=>{
err?console.log(err):console.log(res);
});
}否则{
删除有效负载。_id;//从post中删除空id对象,因为它是空的。
superagent.post(“http://“+this.context.config.API_SERVER+”/API/v1.0/activity/”).send(payload.end((err,res)=>{
err?console.log(err):console.log(res);
this.refs.MyForm.reset();
});
}
开始=时刻(开始).add({days:7}).format();
end=时刻(end).add({days:7}).format();
}while(end{
err?console.log(err):console.log(res);
});
}否则{
删除有效负载。_id;//从post中删除空id对象,因为它是空的。
superagent.post(“http://“+this.context.config.API_SERVER+”/API/v1.0/activity/”).send(payload.end((err,res)=>{
err?console.log(err):console.log(res);
this.refs.MyForm.reset();
});
}
};
因此,如果用户选中repeat(重复)框,并输入他们希望重复til的日期,它将循环提交函数并添加7天,直到结束日期等于所选的重复日期。如果他们不选中该框并选择日期,则只会创建一个事件。可能不是最好的解决方案,但它很有效,而且它与我正在使用的日历配合使用 所以我最终解决了我的问题。虽然这可能不是重复事件的最佳方式,但这是我被告知要在我周围的多个人中做的事情
if(this.refs.repeatCheckbox.checked){
//let endRepeat = moment().endOf("month").format();
let endRepeat = moment(this.state.repeat).add({days: 1}).format();
let start = moment(this.state.start).format();
let end = moment(this.state.end).format();
do {
let newStart = {start: start};
let newEnd = {end: end};
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, newStart, newEnd, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
start = moment(start).add({days: 7}).format();
end = moment(end).add({days: 7}).format();
} while (end < endRepeat);
} else {
var myForm = this.refs.MyForm.getValue();
var payload = _.merge(myForm, startTime, endTime, color, image);
if (payload._id) {
superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
});
} else {
delete payload._id; //remove the empty id object from the post since it's blank.
superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/activity/").send(payload).end((err, res) => {
err ? console.log(err) : console.log(res);
this.refs.MyForm.reset();
});
}
};
if(this.refs.repeatCheckbox.checked){
//让endRepeat=moment().endOf(“月”).format();
让endRepeat=矩(this.state.repeat).add({days:1}).format();
让开始=时刻(this.state.start).format();
让end=moment(this.state.end).format();
做{
让newStart={start:start};