如何比较MongoDB中的日期(NodeJS +猫鼬)?

时间:2019-06-29 07:46:51

标签: node.js mongodb mongoose

我在MongoDB中有一些数据,我想比较存储在其中的两个日期之间的日期。 问题是当我在查询中使用$ 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(猫鼬)中比较这些日期?

2 个答案:

答案 0 :(得分:1)

使用

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))

答案 1 :(得分:1)

您可以轻松检查mongo默认保存的类型。转到mongo shell,然后输入Date()。实际上,它是nodejs中的new Date().toString()。如果输入new Date(),则将获得ISO日期字符串。同样,Date.now()会给出时间戳。

Date.now()始终以纪元秒(UNIX时间)给出 present 时间戳,无论传递给它的参数如何。类型不匹配会导致使用比较运算符时失败。

根据要存储的类型,尝试使用new Date().toISOString()new Date().toString()Date.now()。您提供的示例数据看起来像是ISO日期字符串。