如何在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
相关产品推荐
相关产品推荐

