【问题标题】:How to query mongodb with date stored as string [duplicate]如何使用存储为字符串的日期查询 mongodb [重复]
【发布时间】:2021-02-26 06:29:04
【问题描述】:

您好,我有一个带有员工集合的 mongodb 数据库。集合内的文档如下所示 -

{
  "_id": {
    "$oid": "5fac29ace10c301364931902"
  },
  "id": 11,
  "first_name": "Kristi",
  "last_name": "Dorkins",
  "email": "kdorkinsa@livejournal.com",
  "gender": "Female",
  "startDate": "07/04/2012",
  "endDate": "30/03/2019",
  "deviceStatus": true
}

我需要“startDate”大于特定日期的员工(我从前端传递到服务器)。 我传递给服务器的日期格式是这样的-

2020-11-14T10:36:21.053Z

由于数据库中的日期是字符串格式(“11/05/2011”),我无法在查询语句中找到将其转换为实际日期对象的方法。

      let temp = new Date(req.query.startDate);
      dbase.collection("employee").find({new Date(startDate): { $gte: new Date(temp) }})
        .toArray()
        .then((res) => console.log(res));

在上面的查询中,我尝试创建 key('startDate') 的日期对象,但这似乎是不可能的。

当我尝试以不同的方式进行测试时-

      dbase.collection("employee").find({startDate: { $gte: "02/11/2010" }})
        .toArray()
        .then((result) => {
          console.log(result.length);
          res.send(result);
        });

对于上述查询,我​​得到的所有文档的 startDate 前两位数大于给定日期的前两位数(在上述情况下大于“2”)。这也不行

我已经浏览过这个线程return query based on date 和其他不同的类似问题,但它们都将日期密钥以 ISO 或不同格式存储在数据库中。 另外,由于我是 MongoDB 新手,我尝试了所有可能的方法。请帮忙

【问题讨论】:

  • 您最好将startDate 转换为 date 对象,然后与输入的 date 对象进行比较(即 new Date() )。要将字符串日期转换为日期对象,请使用 $dateFromString 运算符。此运算符需要与$expr 运算符一起使用。
  • @prasad_ 我收到此错误 "MongoError: Error parsing date string '23/09/2011'; 0: Unexpected character '2'" 我认为在字符串日期上使用 $datefromstring

标签: javascript mongodb date datetime mongodb-query


【解决方案1】:

你可以使用$dateFromString解析字符串到日期

例如here,只有一个字段便于阅读。

Mongo 查询是这样的:

db.collection.aggregate([
  {
    "$set": {
      "startDate": {
        "$dateFromString": {
          "dateString": "$startDate",
          "format": "%d/%m/%Y"
        }
      }
    }
  },
  {
    "$match": {
      "startDate": {
        "$gte": yourDate
      }
    }
  }
])

只需使用$set 将解析日期的字段替换为ISODate 使用$dateFromString 然后您可以$match tose 其startDate 大于(或其他)您的日期。

【讨论】:

  • 感谢您的回答。但是我应该在 $match 中输入什么?我不是在寻找“Id”,而是在寻找“startDate”$gte“输入日期”。我对此有点陌生..所以你能详细说明一下
  • 仅删除第一个 $match 阶段。答案已更新。
  • 谢谢你的回答。还有一件事,我在 node.js 中使用 mongoDb。那么如何从这个查询中提取数据呢?
  • 对于 node.js,我只使用了带有 mongoose 的 mongo,所以我不知道语法如何,但我想当你运行查询时,返回的对象与 @ 相同987654323@。所以像var find = mongo.find(query); console.log(query.startDate); 这样的东西应该可以工作。但是我没有在node.js中使用没有mongoose的mongo所以我真的不知道。
  • 我收到此错误 - MongoError: Error parsing date string '23/07/2011'; 0:意外字符“2”
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2016-04-09
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多