Mongoose选择两个时间范围之间的查询

时间:2015-09-02 13:05:04

标签: javascript mongodb mongoose

好的,这很有意思,我正在研究学校的项目时间表,并使用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的初学者。

2 个答案:

答案 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}}]}
            ]