MongoDB / Mongoose在特定日期查询?

时间:2012-08-15 16:35:49

标签: node.js mongodb express mongoose odm

是否可以查询特定日期?

我在mongo Cookbook中发现我们可以在Querying for a Date Range范围内进行 像那样:

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

但具体日期是否可能? 这不起作用:

db.posts.find({"created_on": new Date(2012, 7, 14) })

9 个答案:

答案 0 :(得分:180)

如果你在数据库中保存的日期没有时间(只有年,月,日),这应该有效。

您保存的日期可能是new Date(),其中包含时间组件。要查询这些时间,您需要创建一个包含一天中所有时刻的日期范围。

db.posts.find( //query today up to tonight
  {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

答案 1 :(得分:100)

对于我们这些使用Moment.js

的人
const moment = require('moment')

const today = moment().startOf('day')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lte: moment(today).endOf('day').toDate()
  }
})

重要提示:all moments are mutable

tomorrow = today.add(1, 'days')不起作用,因为它也会改变today。调用moment(today)通过隐式克隆today来解决该问题。

答案 2 :(得分:7)

你试过了吗?

db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

您将遇到的问题是日期存储为Mongo中的时间戳。因此,要匹配您要求它与时间戳匹配的日期。在你的情况下,我认为你试图匹配一天(即在特定日期从00:00到23:59)。如果您的日期没有时间存储,那么您应该没问题。否则,如果gte不起作用,请尝试将日期指定为同一天的时间范围(即start = 00:00,end = 23:59)。

similar question

答案 3 :(得分:6)

是的,Date对象补充了日期和时间,因此将其与日期值进行比较不起作用。

您只需使用$where运算符即可使用Javascript布尔表达式表达更复杂的条件:)

db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })

created_on是日期时间字段,2012-07-14是指定日期。

日期应完全采用 YYYY-MM-DD 格式。

注意:谨慎使用$where,会影响性能。

答案 4 :(得分:6)

您可以使用以下API方法获取特定日期的结果:

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'

答案 5 :(得分:1)

我们的数据库中存在与重复数据相关的问题,日期字段具有多个值,我们原本打算使用1.我想我会添加解决问题的方式以供参考。

我们有一个名为“data”的集合,带有数字“value”字段和日期“date”字段。我们有一个我们认为是幂等的过程,但最终在第二次运行中每天增加2个x值:

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

我们只需要2条记录中的1条,因此必须使用javascript来清理数据库。我们最初的方法是迭代结果并删除任何字段,时间在早上6点到11点之间(所有重复都在早上),但在实施过程中,进行了更改。这是用于修复它的脚本:

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

然后使用mongo thedatabase fixer_script.js

运行它

答案 6 :(得分:0)

似乎没有一个答案对我有用。虽然有人提到了一点提示,但我还是设法使用下面的代码使其工作。

let endDate = startingDate
endDate = endDate + 'T23:59:59';

Model.find({dateCreated: {$gte: startingDate, $lte: endDate}})

startingDate 将是您要查询的具体日期。

我更喜欢这个解决方案,以避免安装 moment,而只是在 postman 中传递 startingDate 之类的 "2021-04-01"

答案 7 :(得分:0)

下面给出了一个非常简单的解决方案

const start = new Date(2020-04-01);
start.setHours(0, 0, 0, 0);
const end = new Date(2021-04-01);
end.setHours(23, 59, 59, 999);
queryFilter.created_at={
    $gte:start,
    $lte:end
}
YourModel.find(queryFilter)

因此,上面的代码只是查找从给定开始日期到给定结束日期的记录。

答案 8 :(得分:0)

我用这种方法做的,效果很好

  public async getDatabaseorderbyDate(req: Request, res: Response) {
    const { dateQuery }: any = req.query
    const date = new Date(dateQuery)
    console.log(date)
    const today = date.toLocaleDateString(`fr-CA`).split('/').join('-')
    console.log(today)
    const creationDate = {
      "creationDate": {
        '$gte': `${today}T00:00:00.000Z`,
        '$lt': `${today}T23:59:59.999Z`
      }
    };

`
``