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

如何在MongoDB的$filter中结合$gte和$lte实现日期区间查询

解决MongoDB聚合$filter中日期区间查询的错误

你遇到的问题根源是MongoDB的$and操作符语法使用不正确——它需要接收一个条件数组,而非将多个条件直接作为$and的子字段。你之前的写法虽然用上了$and,但格式不符合MongoDB的表达式规范,所以才会抛出"An object representing an expression must have exactly one field"的错误。

错误原因拆解

MongoDB要求每个表达式对象只能包含一个操作符字段。你之前的$and写法是把$gte和$lte直接作为$and的属性,这违反了语法规则;正确的$and应该是一个数组,数组中的每个元素都是单独的条件对象(每个对象仅包含一个操作符)。

修正后的区间查询代码

把$and调整为数组形式,将每个条件作为数组的独立元素:

releasedTime: { 
  $filter: { 
    input: "$$movie.releasedTime", 
    as: "movie", 
    cond: { 
      $and: [
        { $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ] },
        { $lte: [ "$$movie", new Date(`${today} 22:00:00.000Z`) ] }
      ]
    } 
  } 
}

完整的聚合代码示例

将修正后的片段替换到原代码中,完整可运行的代码如下:

cityCollection.aggregate([ 
  { 
    "$project": { 
      theater: true, 
      movie: { 
        $filter: { 
          input: { 
            $map: { 
              input: "$movie", 
              as: "movie", 
              in: { 
                cnName: "$$movie.cnName", 
                enName: "$$movie.enName", 
                releasedTime: { 
                  $filter: { 
                    input: "$$movie.releasedTime", 
                    as: "movie", 
                    cond: { 
                      $and: [
                        { $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ] },
                        { $lte: [ "$$movie", new Date(`${today} 22:00:00.000Z`) ] }
                      ]
                    } 
                  } 
                } 
              } 
            } 
          }, 
          as: "movie", 
          cond: "$$movie" 
        } 
      } 
    } 
  } 
]) 
.then(drivers => res.send(drivers)) 
.catch(next);

补充小技巧

其实在MongoDB中,日期区间查询还可以用更简洁的$expr写法,但在$filter的cond参数里,$and数组的写法是最直观且符合语法规范的。修改后你的区间查询就能正常过滤指定时间段内的日期数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:33