使用MongoDB中的$ lt和$ gt过滤日期值

时间:2018-03-16 18:58:38

标签: javascript node.js mongodb date

在我的MongoDB / Node后端中,我正在设置一个函数,该函数接收用户输入的过滤器值并通过GET请求过滤数据。这在很大程度上是有效的。大多数过滤器按预期返回记录。

但是,出生日期(dob)的过滤证明是有问题的。具体来说,在获取dobBefore和dobAfter的值时,结果不正确。根据我看到的记录,我没有得到我期望的日期范围。

对于我的过滤器代码,如果有输入的值我首先将其转换为日期(以匹配我们的数据库值 - 这是日期),然后我运行搜索以仅返回dob所在的记录,在dobBefore的情况下 - 输入该日期值之前的日期(使用$ lt运算符),并且在dobAfter的情况下 - 输入日期值之后的日期(使用$ gt运算符)。这是有问题的代码:

  // dobBefore filter
  if (dobBefore) {
    let dobBeforeDate = new Date(dobBefore);
    console.log('dobBeforeDate: ', dobBeforeDate);
        search['dob'] = { $lt: dobBeforeDate };
  }

  // dobAfter filter
  if (dobAfter) {
    let dobAfterDate = new Date(dobAfter);
    console.log('dobAfterDate: ', dobAfterDate);
        search['dob'] = { $gt: dobAfterDate };
  }

完整的GET请求如下所示:

  

api.somesite.com/v0/customers/details?dobBefore=1998-12-06&dobAfter=1998-02-06&apikey=1d1d1d1&token=ffb4bbb3

正如我先前所说,虽然我只应该看到多布在1998-12-06之前和1998-02-06之后的记录(所以在那10个月的范围内),我看不出那些反映在记录已返回。例如,这是从上面的查询返回的记录之一(显然远远超出目标范围):

"dob": "2007-08-23T05:00:00.000Z"

为了澄清,在文档中,dob是这样存储的,并且是“date”类型:

1998-12-01T06:00:00.000Z

这里有一些关于日期和$ lt和$ gt运算符的问题吗?或者还有其他我想念的东西?

EDIT / UPDATE:

在@Veeram的一些反馈之后,我意识到我正在用另一个覆盖一个查询。我需要结合它们。我认为这样的事情应该有效(顺便说一下,如果没有值,我将dobBefore和dobAfter初始化为空字符串,这就是为什么我要检查空字符串):

let search = {};

// dobBefore filter
if (dobBefore && dobAfter === '') {
   let dobBeforeDate = new Date(dobBefore);
   search['dob'] = { $lt: dobBeforeDate };
}

// dobAfter filter
if (dobAfter && dobBefore === '') {
   let dobAfterDate = new Date(dobAfter);
   search['dob'] = { $gt: dobAfterDate };
}

// filter both at once
if (dobBefore && dobAfter) {
   let dobBeforeDate = new Date(dobBefore);
   let dobAfterDate = new Date(dobAfter);
   search['dob'] = { "$lt" : dobBeforeDate , "$gt" : dobAfterDate };
}

编辑/更新2:上面的代码按预期工作。问题解决了!

1 个答案:

答案 0 :(得分:1)

您正在使用$ gt值覆盖dob密钥。

你想要

{"dob" :{
   "$lt" : ISODate("2018-03-16T19:31:01.229Z"),
   "$gt" : ISODate("2018-03-25T19:31:01.279Z")
}}

尝试

let search = {dob:{}};
if (dobBefore) {
    let dobBeforeDate = new Date(dobBefore);
    console.log('dobBeforeDate: ', dobBeforeDate);
    search['dob'].$lt =  dobBeforeDate;
  }

  // dobAfter filter
if (dobAfter) {
    let dobAfterDate = new Date(dobAfter);
    console.log('dobAfterDate: ', dobAfterDate);
    search['dob'].$gt=  dobAfterDate ;
}

collection.find(search)