You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB查询:匹配今日日期+$in操作符的实现问题

解决方案

首先明确:你的date_array是键值对对象而非数组,$in运算符无法直接作用于这个字段。同时文档中的日期都是当天0点整,之前的写法要么日期格式错误,要么包含时分秒导致匹配失败,以下是正确实现方式:

核心思路

  1. 用$objectToArray将date_array对象转换为键值对数组
  2. 通过$anyElementTrue+$map检查数组中是否存在任意一个日期值落在当天时间范围内
  3. 构造当天起始(00:00:00)和次日起始(00:00:00)的时间区间,规避时分秒的匹配问题

静态日期查询(指定某一天)

如果要查询2023-01-03的文档,直接构造对应时间范围:

db.collection.find({
  $expr: {
    $anyElementTrue: {
      $map: {
        input: { $objectToArray: "$date_array" },
        as: "item",
        in: {
          $and: [
            { $gte: ["$$item.v", new Date("2023-01-03T00:00:00.000Z")] },
            { $lt: ["$$item.v", new Date("2023-01-04T00:00:00.000Z")] }
          ]
        }
      }
    }
  }
})

动态日期查询(自动匹配当前日期)

如果要自动匹配服务器当前日期,先构造当天的时间范围:

// 生成当天0点和次日0点的时间
const todayStart = new Date();
todayStart.setHours(0, 0, 0, 0);
const todayEnd = new Date(todayStart);
todayEnd.setDate(todayEnd.getDate() + 1);

// 执行查询
db.collection.find({
  $expr: {
    $anyElementTrue: {
      $map: {
        input: { $objectToArray: "$date_array" },
        as: "item",
        in: {
          $and: [
            { $gte: ["$$item.v", todayStart] },
            { $lt: ["$$item.v", todayEnd] }
          ]
        }
      }
    }
  }
})

之前写法失败的原因

  • 第一种写法:若日期字符串格式错误(比如保留<YYYY-mm-dd>占位符未替换)会触发语法错误,且$in无法作用于对象类型的date_array
  • 第二种写法:new Date()会生成包含当前时分秒的日期,与文档中0点整的日期无法精准匹配

内容的提问来源于stack exchange,提问作者keynesiancross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:50:24