找到starthour和startminute介于文件starthour和endhour之间的所有文档

时间:2017-09-16 08:43:02

标签: mongodb mongoose mongodb-query

我正在尝试查找当前时间介于文档的startour和endhour之间的所有文档。我为小时和分钟设置了不同的字段。 我的架构

const mySchema = new Schema({
    startHour: { type: Number},
    endHour: { type: Number},
    startMinute: { type: Number},
    endMinute: { type: Number}
})

我在下面写了查找不起作用的查询。这里的小时值和分钟值来自http查询我在查询中使用之前将它们转换为int

find({
    $and : [
                { $or: [{starthour : { $lt: hour}}, 
                    { $and : [ {starthour: { $eq : hour}}, {startMinute: { $gt: minute}}]}
                ]},
                { $or: [{endHour : { $gt: nsh}}, 
                    { $and : [ {endhour: { $eq : hour}}, {endMinute: { $gt: minute}}]}
                ]},
            ],
        })

这应该返回所有文件(小时大于和小于starthour和endhour)或(如果starthour或endhour等于小时而不是startminute应该大于分钟)。

1 个答案:

答案 0 :(得分:0)

这里的逻辑是:

  1. 检查你的小时是否等于endHour与否,如果没有设置的话 isMinMatch是真的。
  2. 如果不相等,请检查确保您的分钟不大于结束分钟。
  3. 然后确保您的开始和结束时间之间的小时数和isMinMatch是真的。
  4. 从结果中删除isMinMatch。
  5. 所以我使用mongo聚合来实现这一点。

    var hour = 11;
    var minute = 0;
    db.getCollection('testHours').aggregate([
    { $addFields: {  
        isMinMatch : {   
            $cond : [{ $eq : [ "$endHour", hour ] } , { $gte : [ "$endMinute" , minute]  }, true ] 
         } 
      }
    },
    {$match: {startHour : { $lte: hour}, endHour : { $gte: hour}, isMinMatch: true } },
    { $project : { isMinMatch: 0 } }
    ])