我有数据存储在MongoDB数据库中,而我正在使用Mongoose来查询数据。我正在尝试对我的数据运行日期查询,以返回属于指定数据范围的数据库中的对象。
我的webform向外部微服务/ api发送API请求,该服务负责查询Mongo数据库中的数据。 API接收代表若干天的单个值。例如:date: "7d"
。然后我继续构建像这样的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);
}
我的数据库中的示例日期是:
start: 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的日期,响应始终为空......
答案 0 :(得分:1)
使用查询的实际日期对象,而不是目前正在执行的字符串。因为mongo存储包含 ISODate
帮助程序的日期,而底层BSON(本机mongo使用的存储数据格式)具有专用日期类型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);
});