【问题标题】:How to compare Dates in MongoDB (NodeJS + mongoose)?如何比较 MongoDB(NodeJS + mongoose)中的日期?
【发布时间】:2019-06-29 07:46:51
【问题描述】:

我在 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 (mongoose) 中比较这些日期?

【问题讨论】:

  • 在架构中,对于 fromdate 和 todate 字段,使用类型作为字符串而不是日期。在存储和查询 fromdate 和/或 todate 时,使用 new Date().toJSON() 生成日期字符串。完成此操作后,您现有的查询将正常工作。
  • 如果您不想接受上述响应,您可以做的另一件事是将当前日期声明为 let currentDate = new Date().toDateString();这次比较应该返回正确的响应

标签: node.js mongodb mongoose


【解决方案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))

【讨论】:

  • 感谢您的回答,但不幸的是它没有用。
【解决方案2】:

您可以轻松检查默认情况下 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 日期字符串。

【讨论】:

    【解决方案3】:

    实际上,您可以简单地使用 new Date() 进行比较,而无需像 mongodb 那样将其转换为 ISODate。看来您必须将 fromdate 的 $gte 切换到 $lte 并将 todate 的 $lte 切换到 $gte,因为 $lte 意味着您的目标/文档日期字段需要早于或等于您指定的日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多