如何使用猫鼬在HH:mm格式时间之间找到MongoDB中的所有文档?

时间:2018-12-20 09:43:42

标签: node.js mongodb mongoose

我正在尝试通过文档开始时间查询猫鼬模型,文档中有一个“ activeTimes”字段,该字段是对象数组, 每个对象都有3个键:工作日开始时间结束时间

模式示例:

const classSchema = new Schema({
    activeTime: [{
        weekday: {
        type: Number,
        required: true,
        min: 0,
        max: 6
     },
     startTime: {
       type: String,
       required: true
     },
     endTime: {
       type: String,
       required: true
     }
   }]
 });

我希望查询模型并找到所有在12:00和15:00之间的文档...但是由于我使用的是HH:mm格式,因此似乎猫鼬无法获取正确的文档结果...

有没有一种方法可以正确查询?

注意:我无法以完整格式保存日期,因为基于weekday属性,每周都会重复该类。

1 个答案:

答案 0 :(得分:1)

您应该能够将所需的时间字符串与$ lte或$ gte运算符进行比较,因为字段的格式是一致的,并且字符串上的$ gt和$ lte只是按字典顺序进行比较。在此处查看更多信息:http://technotip.com/4101/string-comparison-mongodb/

出于逻辑和性能方面的考虑(我在写代码时写的就是这样),我还是建议您将startTime和endTime从“ 00:00”字符串拆分为一个这样的对象:

startTime: {
 hour: Number,
 minute: Number,
 required: true //note that {} would also be a valid value unless you make hour and minute required separately
}

startTime [Number, Number] // where startTime[0] is the hour and startTime[1] is the minute

如果您只有偶数时间,例如15:00或12:00,查询起来很容易,因为您可以使用$ gte和$ lte运算符以与查询日期相同的方式进行查询。如果必须包括分钟,它可能看起来像这样:

例如:

Class.find(
 { 'startTime.hour': {$gte: 12},
 { 'startTime.minute': {$gte: 0},
 { 'endTime.hour': {$lte: 15},
 { 'endTime.minute': {$gte: 0},
)

注意:您必须对此进行更多调整,因为它当前还返回诸如endTime:15:59的值。