首页 > 解决方案 > 检查日期是否属于 mongodb 中的日期数组

问题描述

我有一个描述像这样的从业者的文件

{
   name: String;
   schedules: {
     weekend: [Number],
     timings: [{ 
       from: {hour: Number, minute: Number},
       to: {hour: Number, minute: Number} 
     }]
   }
}

我想要一种方法来使用 mongoose/mongodb 检查时间数组中是否包含日期小时和分钟,但我无法弄清楚这一点,因为我无法找到有关此问题的任何文档/问题

编辑1:

我的输入值为 javascript ISO 日期,预期结果为真或假。

标签: mongodbmongoose

解决方案


询问

  • 而不是ISODate("2017-01-01T02:46:12Z")把你的日期变量放在两个地方
  • 第一个 let 创建一个用于比较的日期变量
  • 从假开始减少
  • 如果还没有找到匹配项
  • 检查 from_date(convert_first) <= your_date <= to_date(convert_first)
  • 否则,如果已经找到匹配项,则保留真实值
  • 如果至少有一个匹配所有 reduce 将评估为 true
  • 将该真/假值设置为新字段
  • 您可以根据需要对其进行过滤,以保留虚假或真实的文件

测试代码在这里

aggregate(
[{"$set": 
    {"date-in-timings": 
      {"$let": 
        {"vars": 
          {"your_date": 
            {"$dateFromParts": 
              {"year": 2021,
                "hour": {"$hour": ISODate("2017-01-01T02:46:12Z")},
                "minute": {"$minute": ISODate("2017-01-01T02:46:12Z")}}}},
          "in": 
          {"$reduce": 
            {"input": "$schedules.timings",
              "initialValue": false,
              "in": 
              {"$cond": 
                [{"$not": ["$$value"]},
                  {"$and": 
                    [{"$gte": 
                        ["$$your_date",
                          {"$dateFromParts": 
                            {"year": 2021,
                              "hour": "$$this.from.hour",
                              "minute": "$$this.from.minute"}}]},
                      {"$lte": 
                        ["$$your_date",
                          {"$dateFromParts": 
                            {"year": 2021,
                              "hour": "$$this.to.hour",
                              "minute": "$$this.to.minute"}}]}]}, "$$value"]}}}}}}}])

推荐阅读