在我的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:上面的代码按预期工作。问题解决了!
答案 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)