gpt4 book ai didi

javascript - 蒙戈数据库 : Find and insert if time slots doesn't conflict with other time slots

转载 作者:行者123 更新时间:2023-12-01 02:26:09 27 4
gpt4 key购买 nike

我有一个事件架构:

owner: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
},
participants: [
{
type: Schema.Types.ObjectId,
ref: 'User'
}
],
createdOn: { type: Date, default: Date.now },
lastModified: { type: Date, default: Date.now },
active:{ type: Boolean, default: false },
eventDate: { type: Date },
startAt: { type: Date },
endAt : { type: Date },
timeZone:{ type: 'String', required: true }

我想插入事件,使这些事件不会与其他事件重叠(例如:如果某个事件发生在 2018 年 2 月 14 日,从凌晨 3:00 开始,到凌晨 4:00 结束,则不应有任何事件此日期凌晨 3:00 至凌晨 4:00 之间(除此事件外)。但此日期其他时间段可能有事件,但不得在凌晨 3:00 至凌晨 4:00 之间举办)

我尝试了以下逻辑,但似乎不起作用。这个逻辑有什么问题:

const eventData = {
owner: req
.body
.owner
.trim(),
startAt: setTimeToDate(req.body.eventDate, req.body.startAt.trim(), req.body.timeZone),
endAt: setTimeToDate(req.body.eventDate, req.body.endAt.trim(), req.body.timeZone),
eventDate: moment(req.body.eventDate).toISOString(),
participants: req.body.participants,
active: true,
timeZone: req.body.timeZone
};

Events.find({
$and: [
{
"eventDate": new Date(eventData.eventDate)
}, {
$or: [
{
$and: [
{
"startAt": {
$lt: new Date(eventData.startAt)
}
}, {
"startAt": {
$lte: new Date(eventData.endAt)
}
}
]
}, {
$and: [
{
"endtAt": {
$gte: new Date(eventData.startAt)
}
}, {
"endtAt": {
$gt: new Date(eventData.endAt)
}
}
]
}
]
}

]
})
.exec(function (err, results) {
const count = results.length;
if (!count) {
const newEvent = new Events(eventData);
newEvent.save((err) => {
if (err) {
res
.status(400)
.json({success: false, message: 'Could not create this availability.'});
}
res
.status(200)
.send({success: true, message: 'Your availability on this date is created successfully.'});
});
}

});

最佳答案

所以我所做的就是找出一个事件与其他事件重叠的机会。

第一种情况是我要插入的新事件的开始时间位于任何其他事件的开始时间和结束时间之间。

第二种情况类似,唯一的区别是这次我检查要插入的新事件的结束时间是否在任何其他事件的开始时间和结束时间之间。

第三种情况是新事件的开始时间小于任何其他事件的开始时间并且新事件的结束时间大于任何其他事件的结束时间。

以上3种场景涵盖了所有时隙重叠的情况其查询如下所示

{
$or: [
{
$and: [
{
"startAt": {
$lte: new Date(new Date(eventData.startAt))
}
}, {
"endAt": {
$gte: new Date(new Date(eventData.startAt))
}
}
]
}, {
$and: [
{
"startAt": {
$lte: new Date(new Date(eventData.endAt))
}
}, {
"endAt": {
$gte: new Date(new Date(eventData.endAt))
}
}
]
}, {
$and: [
{
"startAt": {
$gte: new Date(new Date(eventData.startAt))
}
}, {
"endAt": {
$lte: new Date(new Date(eventData.endAt))
}
}
]
}
]
}

关于javascript - 蒙戈数据库 : Find and insert if time slots doesn't conflict with other time slots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48782039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com