我正在创建一个搜索端点,它将通过日期范围过滤结果。
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' } }
但是我收到以下错误。
Cast to date failed for value "{ lte: '2018-10-03T14:07:03.382Z' }" at path "created_at" for model "Transaction""
最佳答案
简短回答:应该是 $lte
,而不是 lte
。
长答案:
有一个非常好的教程,您需要了解Working With Dates在 Mongoose 中。
假设您有一个架构,其中声明了 Date
类型的字段。
When you create a document, Mongoose will cast the value to a native JavaScript date using the Date() constructor.
An invalid date will lead to a CastError when you validate the document.
由于缺少 $
符号,您的查询将被接受,例如“查找我的交易,其中 created_at
是一个等于 { lte: '2018-10-03T14 的对象:07:03.382Z'}
"。
Mongoose 会尝试将此值转换为日期。
new Date({ lte: '2018-10-03T14:07:03.382Z' });
显然这不是一个有效的日期,并且此表达式将失败并显示 CastError
。
关于Node.js 和 Mongoose - 值转换为日期失败(过滤创建的日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926095/