【问题标题】:How to get the data between two dates | NodsJs | MongoDB如何获取两个日期之间的数据 | NodsJs | MongoDB
【发布时间】:2021-10-11 06:00:00
【问题描述】:

我正在尝试创建一个 api 来获取 NodeJS 中两个日期之间的数据。我的数据库是mongoDB,我的数据是这样的

_id:ObjectId("60ff19125474fa0ec45c2d1a")
username:"abc"
Date:"2021-7-26"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

_id:ObjectId("6101f4a4676d8b2b743a2d58")
username:"abc"
Date:"2021-7-27"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

_id:ObjectId("6102e1357ad1ed20d4642db0")
username:"abc"
Date:"2021-7-28"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

_id:ObjectId("6104717cb025c025e8b2d15e")
username:"abc"
Date:"2021-8-01"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

我想获取两个日期之间的数据,我创建了一个 api 来按日期(单个)获取数据,需要一些修改才能在两个日期之间获取它。

这里是按日期获取数据的 api:


fetchHistorybydate =(req,res)=>{
  
  var HistoryList = []
      User.find({"username":req.body.username, "leave":{ $exists : false} },function(err,data){              
        for(var i =1 ;i<data.length;i++){
          var NDate = data[i].Date;
          if(NDate==req.body.date){
            HistoryList.push(data[i])
          }
        }
        if(err)
        {res.status(300).json("Error")}
          else{
          var token = jwt.sign({
            data: 'foobar'
          }, 'secret', { expiresIn: "30 minute"})
          res.status(200).json({AccessToken: token,data:HistoryList})
    }
  })
}


例如:

假设前端有两个日历,一个是Fromdate,第二个是Todate,如果用户从Fromdate日历这个2021-7-26Todate日历这个2021-7-28然后它只会获取这些日期的记录。

输出应该是,根据上面的数据

_id:ObjectId("60ff19125474fa0ec45c2d1a")
username:"abc"
Date:"2021-7-26"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

_id:ObjectId("6101f4a4676d8b2b743a2d58")
username:"abc"
Date:"2021-7-27"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

_id:ObjectId("6102e1357ad1ed20d4642db0")
username:"abc"
Date:"2021-7-28"
TimeIn:"2:02 PM"
TimeOut:"2:02 PM"

请帮助我如何做到这一点。

【问题讨论】:

  • 你的问题不够清楚。 获取两个日期之间的数据是什么意思?
  • @mubin986 让我添加示例
  • @mubin986 我编辑了我的代码,请检查,希望现在清楚了!
  • 如果你存储时间戳而不是实际的日期字符串会容易得多
  • 你的代码间距和缩进很不一致,太局促了。这使得它难以阅读。你应该解决这个问题。

标签: node.js mongodb


【解决方案1】:

您必须在数据库的 Date 参数中更新存储 Date 对象。之后,您将能够按两个日期范围进行查询。目前,您的 Date 参数是一个字符串,但您必须将其转换为 Date 对象。

转换为Date对象后的解决方法如下:

fetchHistorybydate = (req, res) => {
    var query = {
        username: req.body.username,
        Date: {
            $gte: new Date(req.body.Fromdate).toISOString(),
            $lte: new Date(req.body.Todate).toISOString()
        },
        leave: { $exists: false }
    }

    User.find(query, function (err, data) {
        if (err) { return res.status(300).json("Error") }
        else {
            return res.status(200).json({ data: data })
        }
    })
}

注意:取回数据后无需再循环整个数组。因为我们已经使用$gte$lte 参数从我们的数据库中query。其中$gte 表示greater than or equal$lte 表示less than or equal

您还可以使用$gt(大于)和$lt(小于)。

【讨论】:

  • 我收到此错误 RangeError: Invalid time value at this line $gte: new Date(req.body.Fromdate).toISOString(),
  • 但是什么时候这样做$gte:"2021-07-26"$lte:"2021-07-30"我得到了数据,但不包括26日的数据,它从28日获取数据
  • 我不想硬这个,我会在前端传递来自日历的值,请帮助ppp!
  • 刚刚更新了我的答案,看看,让我知道它是否有效。
  • 更新答案:您必须更新数据库的 Date 参数中的 store Date 对象。之后,您将能够按两个日期范围进行查询。目前,您的 Date 参数是一个字符串,但您必须将其转换为 Date 对象。
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2020-03-02
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多