[英]How to compare Dates in MongoDB (NodeJS + mongoose)?
我在 MongoDB 中有一些数据,我想比较存储在其中的日期在 2 个日期之间。 问题是当我在查询中使用 $gte 或 $lte 时它总是返回 null 。
架构:
const SettingSchema = new Schema({
advertisment: [
{
name: {
type: String,
required: true
}
,
fromdate: {
type: Date,
default: Date.now()
}
,
todate: {
type: Date
}
,
active:{
type:Boolean
}
}
]});
样本数据:
{
"advertisment": [
{
"fromdate": "2010-06-29T06:53:32.643Z",
"_id": "5d170b634ebf4d1848efbe9a",
"name": "ads1",
"todate": "2030-06-29T09:38:32.643Z",
"active": true
},
{
"fromdate": "2010-06-29T06:53:32.643Z",
"_id": "5d170baae38bc832c4d89d9a",
"name": "ads2",
"todate": "2030-06-29T09:38:32.643Z",
"active": true
}
]
}
询问 :
let currentDate = new Date();
Setting.findOne(
{
"advertisment.active": true,
"advertisment.fromdate": { $gte: currentDate },
"advertisment.todate": { $lte: currentDate },
},
'advertisment')
.then(data =>
{
console.log(data);
})
.catch(err => console.log(err))
如何在 MongoDB(猫鼬)中比较这些日期?
用
new Date().toISOString()
代替
new Date()
尝试 :
let currentDate = new Date().toISOString();
Setting.findOne(
{
"advertisment.active": true,
"advertisment.fromdate": { $gte: currentDate },
"advertisment.todate": { $lte: currentDate },
},
'advertisment')
.then(data =>
{
console.log(data);
})
.catch(err => console.log(err))
您可以轻松检查默认情况下 mongo 保存的类型。 转到 mongo shell,然后输入Date()
。 它本质上是 nodejs 中的new Date().toString()
。 如果您输入new Date()
您将获得 ISO 日期字符串。 同样, Date.now()
会给出时间戳。
Date.now()
总是以纪元秒(UNIX 时间)为单位给出当前时间戳,而不管传递给它的参数如何。 使用比较运算符时,类型不匹配会导致失败。
根据您存储的类型,尝试使用new Date().toISOString()
或new Date().toString()
或Date.now()
。 您提供的示例数据看起来像是 ISO 日期字符串。
实际上,您可以简单地使用new Date()
进行比较,而无需像 mongodb 那样将其转换为 ISODate。 看来您必须将 fromdate 的 $gte 切换为 $lte 并将 todate 的 $lte 切换为 $gte,因为 $lte 意味着您的目标/文档日期字段需要早于或等于您指定的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.