Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose聚合不按输入日期过滤_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb Mongoose聚合不按输入日期过滤

Mongodb Mongoose聚合不按输入日期过滤,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我正在尝试构建一个聚合查询,但是当我对日期使用$match时,它并没有像我预期的那样工作。如果我使用其他字段而不是任何Date字段,它将按预期工作。我使用的代码示例如下: const res = await Reservation.aggregate([{ $match: { createdAt: { $lte: req.endDate } } }]).exec(); const res = await Reservation.find({ createdAt: { $lte: req.end

我正在尝试构建一个聚合查询,但是当我对日期使用
$match
时,它并没有像我预期的那样工作。如果我使用其他字段而不是任何
Date
字段,它将按预期工作。我使用的代码示例如下:

const res = await Reservation.aggregate([{ $match: { createdAt: { $lte: req.endDate } } }]).exec();

const res = await Reservation.find({ createdAt: { $lte: req.endDate } }).exec();
第一行不起作用,但第二行效果很好。
.find()
.aggregate()
之间有什么区别。谢谢你的帮助

猫鼬有“模式”,它会为你做一件叫做“自动播放”的神奇事情。设计师在这里考虑的典型情况是,来自“web”交互的所有输入,如
GET
POST
基本上都包含在一个“字符串”中

无论是否有某个帮助程序将参数变成具有键和值的对象,所有这些“值”仍然是“字符串”,或者可能由相同的“帮助程序”在适当的情况下直接生成数字。这是常见的web框架设计

因此,当您发出
.find()
时,此函数除了省略字段/属性外,完全无法更改返回的内容,因此应用了“模式”

.aggregate()
方法完全不同。它的全部存在就是修改文档和集合中包含的内容。其结果是模式“不可能”应用

因此,像
.find()
这样的方法中出现的“自动广播”不会发生,您需要自己将元素(例如发送给您的“日期”的“字符串”)强制转换为正确的类型:

Reservation.aggregate([
{“$match”:{“createdAt”:{“$lte”:新日期(req.endDate)}
])
即使您所做的只是一个
$match
,并且您没有以任何方式“修改”模式,mongoose也不会“假定”这一点,也不会尝试强制转换到模式中的匹配字段

这里的逻辑是,
$match
阶段或任何可以绑定到“类型”的类似内容都可能发生在管道中的任何位置。因此,不能保证管道阶段处理的文档与原始集合模式有任何相似之处

可以认为,“强”>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>。但这不是当前代码库的工作方式


因此,简言之,在使用聚合管道时,所有需要专门转换为类型(日期、ObjectId等)的对象都需要在代码中“手动”转换,而不是假设mongoose会像在其他方法中一样为您执行转换。

您是否也尝试过fluent pipeline builder API
Reservation.aggregate().match({createdAt:{$lte:req.endDate}).exec()
?@chridam,是的。它不起作用