【问题标题】:How to find Records between startDate and endDate - Nodejs, mongodb如何在 startDate 和 endDate 之间查找记录 - Nodejs,mongodb
【发布时间】:2022-02-08 04:42:34
【问题描述】:

我的数据库中有 4 条记录。

{"_id":{"$oid":"6200b15e91f762376cd43ac3"},"startDate":{"$date":"2021-01-01T00:00:00.000Z"},"endDate":{"$date":"2021-01-28T18:29:59.059Z"},"__v":0}
{"_id":{"$oid":"6200b15e91f762376cd43ac4"},"startDate":{"$date":"2021-01-01T00:00:00.000Z"},"endDate":{"$date":"2021-01-23T18:29:59.059Z"},"__v":0}
{"_id":{"$oid":"6200b15e91f762376cd43ac5"},"startDate":{"$date":"2021-01-05T00:00:00.000Z"},"endDate":{"$date":"2021-01-28T18:29:59.059Z"},"__v":0}
{"_id":{"$oid":"6200b15e91f762376cd43ac6"},"startDate":{"$date":"2021-01-05T00:00:00.000Z"},"endDate":{"$date":"2021-01-25T18:29:59.059Z"},"__v":0}

我的用户界面如下所示:

我的mongodb查询如下:(我试过的)

data.find({
                    "$or": [
                      {"startDate": {"$gte": startDate}},
                      {"endDate": {"$lte": endDate}}
                    ]
                  });

当使用上面的查询进行搜索时,我只得到 1 条记录,即:{"_id":{"$oid":"6200b15e91f762376cd43ac3"},"startDate":{"$date":"2021-01-01T00:00:00.000Z"},"endDate":{"$date":"2021-01-28T18:29:59.059Z"},"__v":0} 而不是全部 4 条。

从 UI 发送时,我将其转换为: req.query:

dateStart: '2021-01-01',
dateEnd: '2021-01-28',

然后转成new Date()格式:

let startDate = new Date(req.query.dateStart); 
let endDate = new Date(req.query.dateEnd);

我不知道我在查询中出了什么问题。需要帮忙!谢谢!

【问题讨论】:

  • 不应该是和声明,因为它必须满足 gte startdate '和' lte enddate
  • 尝试将日期转换为 ISO 格式。这应该会有所帮助。
  • 同样,当您创建新的“2021-01-28”日期时,它会给出"2021-01-28T00:00:00.000Z",因此您不会得到第一个和第三个结果
  • @cmgchess 不应该是什么?我没有得到你
  • @Gobind Deep Singh 我尝试将其转换为 ISO 格式。那是行不通的。这会改变数据库中内容的格式以及我发送到后端查询的内容吗?

标签: javascript node.js mongodb mongodb-query aggregation-framework


【解决方案1】:

使用 $and 似乎可以按预期工作:

 db.collection.aggregate([
  {
    $match: {
      startDate: {
        $gte: {
       "$date": "2021-01-01T00:00:00.000Z"
       }
       },
      endDate: {
        $lte: {
       "$date": "2021-01-28T00:00:00.000Z"
       }
      }
     }
  }
])

playground

【讨论】:

  • 这似乎也不起作用。当我在 mongo 操场上对其进行编码时,它工作正常。但我不明白为什么它在我的机器上不起作用
  • 跟日期格式有关系吗?因为它根本不起作用
【解决方案2】:

由于您希望返回所有 4 条记录,因此对于结束日期,您应该使用日期 2021-01-28 结束之前的时间(2021-01-28T23:59:59.999Z)而不是日期开始时间(2021-01-28T00:00:00.000Z)进行查询。

Here's a resource on timestamps format.

所以这样的查询会起作用:

db.collection.find({
  startDate: {
    $gte: {
      "$date": "2021-01-01T00:00:00.000Z"
    }
  },
  endDate: {
    $lte: {
      "$date": "2021-01-28T23:59:59.999Z"
    }
  }
})

【讨论】:

  • 实际上没有。这对我不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
相关资源
最近更新 更多