gpt4 book ai didi

javascript - 在 MongoDB 中使用 $lt 和 $gt 过滤日期值

转载 作者:行者123 更新时间:2023-12-03 02:17:07 24 4
gpt4 key购买 nike

在我的 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 月 6 日之前和 1998 年 2 月 06 日之后(因此在这 10 个月范围内)的记录,但我没有看到这一点反射(reflect)在返回记录。例如,这是从上面的查询返回的记录之一(显然远远超出了目标范围):

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

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

1998-12-01T06:00:00.000Z

这里有一些关于日期以及 $lt 和 $gt 运算符的问题吗?还是我还缺少其他东西?

编辑/更新:

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

最佳答案

您正在使用 $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)

关于javascript - 在 MongoDB 中使用 $lt 和 $gt 过滤日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49327818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com