首页 > 解决方案 > Node.js 和 Mongoose - Cast to date 值失败(过滤 created_at 日期)

问题描述

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

http://0.0.0.0:3000/api/v1/transactions/search?endDate=2018-10-03T14:07:03.382Z

所以上面,想要搜索所有交易直到和等于 created_at 日期。

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' } }

但是我收到以下错误。

模型“Transaction”的路径“created_at”中的值“{ lte: '2018-10-03T14:07:03.382Z'}”的转换至今失败

标签: node.jsmongodbmongoose

解决方案


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

长答案

关于在猫鼬中使用日期,您需要了解一些非常好的教程。

假设您有一个架构,其中声明了类型为Date.

创建文档时,Mongoose 会使用 Date() 构造函数将值转换为原生 JavaScript 日期。

验证文档时,无效日期将导致 CastError。

由于缺少$符号,您的查询被接受,例如“查找created_at对象相等的交易{ lte: '2018-10-03T14:07:03.382Z' }”。

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

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

显然这不是一个有效的日期,并且这个表达式将失败并显示CastError.


推荐阅读