首页 文章

猫鼬日期过滤器

提问于
浏览
3

我有数据存储在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 回答

  • 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);    
    });
    

    更好的是,您可以使用具有非常直观且简单的日期时间操作API的 momentjs 插件 . 您可以使用的一种方法是 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);    
    });
    

相关问题