【发布时间】:2022-11-07 15:21:02
【问题描述】:
我正在尝试查找大于或等于一个月前创建的所有文档。
但是当我查询数据库时,它在执行以下代码时什么也不返回:
console.log(moment().add(-31, "days").toDate()) // this logs 2022-09-30T07:27:26.373Z
let filter = {
companyId: companyId,
userId: userId,
_created_at: {$gte: moment().add(-31, "days").toDate()}
};
db.collection("Users")
.find(filter)
.count()
.then(count => {
if(!count){
return resolve({result: [], count: 0});
} else {
db.collection("Users")
.find(filter)
.sort({_created_at: -1})
.limit(parseInt(limit))
.skip(parseInt(page) * parseInt(limit))
.toArray()
.then(result => {
resolve({result: result, count: count});
})
.catch(error => {
console.log(error);
reject(error);
})
}
});
但是,当我执行以下过滤器时,它会起作用并返回文档:
let filter = {
companyId: companyId,
userId: userId,
_created_at: {$gte: moment().add(-31, "days").format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]") }
};
我唯一改变的是日期的格式,我正在指定它应该如何格式化以等于 DB,但我不想做一些硬编码的事情。虽然 moment().add(-31, "days").toDate() 在我的数据库中匹配相同的格式。
为什么我没有从查询中得到任何结果?
【问题讨论】:
-
这是错误的做法。日期值应该是绝不存储为字符串,这是一个设计缺陷。始终正确存储
Date对象。然后{$gte: moment().add(-31, "days").toDate()}将按预期工作。