我将数据存储在 MongoDB 数据库中,我正在使用 Mongoose 查询数据。我正在尝试对我的数据运行日期查询,以从数据库中返回属于指定数据范围内的对象。
我的网络表单向负责查询 Mongo 数据库中数据的外部微服务/api 发送 API 请求。 API 接收代表天数的单个值。例如:日期:“7 日”
。然后我继续像这样构建 mongoose 查询:
if (data.date) {
const date = new Date();
const dateRange = data.date.slice(0, -1); // strip the "d" from "7d"
date.setDate(date.getDate() - dateRange);
query.start = { $lte: date.toISOString() };
console.log(query);
}
我的数据库中的示例日期是:
开始:2016-02-10T09:09:01.000Z
然后执行查询:
Call.find(query, function (error, docs) {
if (error) {
callback(error, null);
} else {
callback(null, docs);
}
});
最后是一个query
的例子:
{ approved: 1, start: { '$lte': '2016-02-09T14:24:29.115Z' } }
但是,无论我将什么日期发送到我的 API,响应始终为空...
最佳答案
为您的查询使用实际的日期对象,而不是像您目前所做的那样使用字符串。因为 mongo 存储用 ISODate
包裹的日期 助手和底层 BSON(mongo native 使用的存储数据格式)有一个专用的日期类型 UTC 日期时间,它是一个 64 位(因此,8 字节)有符号整数,表示自 Unix 时间纪元以来的毫秒数,您的查询不会'不返回任何内容,因为它将比较 mongo 中的日期字段和 ISO 格式的字符串。
因此,放弃 toISOString()
转换并使用日期对象:
if (data.date) {
const date = new Date();
const dateRange = data.date.slice(0, -1); // strip the "d" from "7d"
date.setDate(date.getDate() - dateRange);
query.start = { $lte: date };
console.log(query);
}
Call.find(query, function (error, docs) {
if (error) callback(error, null);
callback(null, docs);
});
更好的是,您可以使用 momentjs 具有非常直观和简单的日期时间操作 API 的插件。您可以使用的一种方法是 subtract()
获取日期对象 n
天前的函数:
if (data.date) {
const dateRange = data.date.slice(0, -1); // strip the "d" from "7d"
const date = moment().subtract(dateRange, "days");
query.start = { $lte: date };
console.log(query);
}
Call.find(query, function (error, docs) {
if (error) callback(error, null);
callback(null, docs);
});
关于javascript - Mongoose 日期过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318005/