Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 猫鼬日期过滤器_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 猫鼬日期过滤器

Javascript 猫鼬日期过滤器,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我将数据存储在MongoDB数据库中,并使用Mongoose查询数据。我正在尝试对数据运行日期查询,以从数据库返回属于指定数据范围的对象 我的webform向负责查询Mongo数据库中数据的外部微服务/API发送API请求。API接收代表天数的单个值。例如:日期:“7d”。然后,我继续构建mongoose查询,如下所示: if (data.date) { const date = new Date(); const dateRange = data.date.slice(0, -

我将数据存储在MongoDB数据库中,并使用Mongoose查询数据。我正在尝试对数据运行日期查询,以从数据库返回属于指定数据范围的对象

我的webform向负责查询Mongo数据库中数据的外部微服务/API发送API请求。API接收代表天数的单个值。例如:
日期:“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);
}
我的数据库中的一个示例日期是:

开始:2016-02-10T09:09:01.000Z

然后执行查询:

Call.find(query, function (error, docs) {
    if (error) {
        callback(error, null);
    } else {
        callback(null, docs);
    }
});
最后是
查询
的一个示例:

{ approved: 1, start: { '$lte': '2016-02-09T14:24:29.115Z' } }

但是,无论我发送给API的日期是什么,响应总是空的…

使用实际日期对象进行查询,而不是像您目前所做的那样使用字符串。因为mongo存储用助手包装的日期,并且基础BSON(mongo本机使用的存储数据格式)有一个专用的日期类型UTC datetime,它是一个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);    
});

更好的是,您可以使用具有非常直观和简单的datetime Manipulation API的插件。一种方法是使用函数获取日期对象
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);    
});

我仍然从我的请求中得到一个空的响应,这是一个更新的查询示例:
{start:{'lte':2016年2月9日星期二17:45:56 GMT+0000(UTC)}
您有一些示例文档可以测试吗?这是我正在查询的日期对象
start
的原始格式<代码>“开始”:ISODate(“2016-02-10T09:09:01.000+0000”)我应该使用
$gte
而不是
$lte
。。。哦。@leaksterrr您可以编辑您的问题来纠正这一点,我随后可以更新我的答案:)