好的,这很有意思,我正在研究学校的项目时间表,并使用mongoDB, 没有时间属性。
我想在一个类中的两个时间范围之间进行查询。
这个SQL查询可以正常工作,但我在mongoose中尝试这个:
SELECT * From Schedule WHERE room_name = ? AND ((start_time) BETWEEN @KP and @KD OR (end_time) BETWEEN @KP and @KD) AND day=?
例如:
第一堂课从周一8号房间的08:00到09:00开始。
如果我尝试在开始时间添加另一个讲座:08:30结束时间:周一8号房间的09:30,它应该告诉我,我不能,因为班级现在很忙。
这是使用的架构:
day: Number,
start_time: Date,
end_time: Date,
room: [{ type: Schema.Types.ObjectId, ref: 'Room' }]
我需要一些想法如何解决这个问题:)因为我是mongo的初学者。
答案 0 :(得分:3)
我假设模特名称是Lecture。
var newStartTime; //Start time for class to be created.
var newEndTime; //End time for class to be created.
Lecture.find({$and: [
{$or: [{$and: [{start_time: {$lte: newStartTime}}, {end_time: {$gte: newStartTime}}]}, {$and: [{start_time: {$lte: newEndTime}}, {end_time: {$gte: newEndTime}}]}]},
{$not: {$or: [{start_time: {$eq: newEndTime}}, {end_time: {$eq: newStartTime}}]}}
]}, function (err, results) {
if (err) {
//handle error
return;
}
if (results.length > 0)
{
//Clashing class, handle
}
});
以上查询检查:
的讲座答案 1 :(得分:2)
感谢@ZeMoon我解决了我的问题,如果有人需要,这是完整的查询:
$or: [{$and: [
{$or: [
{$and: [{start_time: {$lt: newStartTime}}, {end_time: {$gt: newStartTime}}]},
{$and: [{start_time: {$lt: newEndTime}}, {end_time: {$gt: newEndTime}}]},
{$and: [{start_time: {$gte: newStartTime}}, {end_time: {$lte: newEndTime}}]},
]},
{$or: [{start_time: {$ne: newStartTime}}, {end_time: {$ne: newEndTime}}]},
]
},
{$and: [{start_time: {$eq: newStartTime}}, {end_time: {$eq: newEndTime}}]}
]