猫鼬日期过滤器

时间:2016-02-10 14:34:05

标签: javascript node.js mongodb mongoose

我有数据存储在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的日期,响应始终为空......

1 个答案:

答案 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);    
});