繁体   English   中英

"如何比较 MongoDB(NodeJS + mongoose)中的日期?"

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM