Node.js和Mongoose-值的转换到日期失败(筛选在日期创建的\u)

Node.js和Mongoose-值的转换到日期失败(筛选在日期创建的\u),node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在创建一个搜索端点,该端点将通过日期范围过滤结果 http://0.0.0.0:3000/api/v1/transactions/search?endDate=2018-10-03T14:07:03.382Z 因此,上面的代码希望搜索所有在创建的_之前的事务 console.log(req.query.endDate) // 2018-10-03T14:07:03.382Z 这是我构建的查询的一部分 created_at = { gte: startDate, lte: en

我正在创建一个搜索端点,该端点将通过日期范围过滤结果

http://0.0.0.0:3000/api/v1/transactions/search?endDate=2018-10-03T14:07:03.382Z
因此,上面的代码希望搜索所有在创建的_之前的事务

console.log(req.query.endDate) // 2018-10-03T14:07:03.382Z
这是我构建的查询的一部分

created_at = {
   gte: startDate,
   lte: endDate,
};

    let query = {
    ...query,
    created_at
}

const transactions = await Transaction.find(query);
这就是我的查询字符串的样子

{ created_at: { lte: '2018-10-03T14:07:03.382Z' } }
但是,我得到了以下错误


对于位于的值“{lte:'2018-10-03T14:07:03.382Z'}”,到目前为止的强制转换失败 模型“事务”的路径“已创建”


简短回答:应该是
$lte
,而不是
lte

长答案

有相当好的教程,你需要了解猫鼬

假设您有一个模式,其中声明了类型为
Date
的字段

创建文档时,Mongoose将使用date()构造函数将值转换为本机JavaScript日期

当您验证文档时,无效日期将导致错误

由于缺少
$
符号,您的查询被接受,就像“在
处创建的
是一个等于
{lte:'2018-10-03T14:07:03.382Z'}
的对象”一样

Mongoose将尝试将此值转换为日期

new Date({ lte: '2018-10-03T14:07:03.382Z' });

显然,这不是一个有效的日期,并且这个表达式将失败,因为路径“created_at”处的值“{lte:2018-10-03T14:07:03.382Z}”对于模型“Transaction”的值“{lte:2018-10-03T14:07:03.382Z}”的Cast to date failed”也错过了
$
符号,只是更新了答案,请再试一次,因为它工作得太多了。顺便说一句,我不需要做新的日期,如果它已经对你更好:)旧的答案不是很准确。这里我用更详细的解释来代替它