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

11

我有一些数据存储在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(mongoose)中比较这些日期?

在模式中,将fromdate和todate字段的类型设置为String而不是Date。在存储和查询fromdate和/或todate时,使用new Date().toJSON()生成日期字符串。完成此操作后,您现有的查询将正常工作。 - Abhishek Kulkarni
如果您不想使用上面的响应,另一件可以做的事情是将当前日期声明为 let currentDate = new Date().toDateString();。这次比较应该会返回正确的响应。 - Owolabi Ezekiel Tobiloba
3个回答

7

使用

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

5
谢谢您的回答,但不幸的是它并没有起作用。 - MohammadHosein

4
您可以轻松地检查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日期字符串。

1

实际上,您可以直接使用new Date()进行比较,而无需将其转换为ISODate,就像mongodb一样。看起来您需要将fromdate的$gte切换为$lte,并将todate的$lte切换为$gte,因为$lte表示您的目标/文档日期字段需要早于或等于指定日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接