MongoDB/Mongoose在特定日期查询?

Uni*_*ech 129 mongoose mongodb node.js express odm

是否可以查询特定日期?

我在mongo Cookbook中发现我们可以在一个范围内查询日期范围 ,如下所示:

db.posts.find({"created_on": {"$gte": start, "$lt": end}})
Run Code Online (Sandbox Code Playgroud)

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

db.posts.find({"created_on": new Date(2012, 7, 14) })
Run Code Online (Sandbox Code Playgroud)

rdr*_*rey 190

如果您在数据库中保存的日期没有时间(仅年,月,日),那应该有效.

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

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

  • 请记住,在Date()函数中,month参数从0开始计数,而不是1.另一方面,日期从1开始计数...... [详情](https://developer.mozilla.org/en -US /文档/网络/的JavaScript /参考/ Global_Objects /日) (25认同)
  • 如果日期存储如下,此方法是否正常工作:>>"date":ISODate("2016-01-04T14:07:17.496Z") (2认同)

Pie*_*eau 104

对于我们这些使用Moment.js的人

const moment = require('moment')

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

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lte: moment(today).endOf('day').toDate()
  }
})
Run Code Online (Sandbox Code Playgroud)

重要提示:所有时刻都是可变的!

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

  • 我建议使用`.startOf('day')`而不是.hours(0).minutes(0).seconds(0).所以第一行是:`var today = moment().startOf('day')` (13认同)
  • 如果我们使用“ moment(today)”来克隆对象,那么另一个解决方案是:“ var明天= today.clone()。add(1,'days')` (2认同)

Fai*_*ain 9

是的,Date对象完善了日期和时间,因此将它与日期值进行比较不起作用.

你可以简单地使用$ where运算符用Javascript布尔表达式来表达更复杂的条件:)

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

created_on是datetime字段,2012-07-14是指定的日期.

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

注意:使用$where谨慎,它会对性能产生影响.


Mic*_*son 8

你有没有尝试过:

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

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

类似的问题


Dan*_*mak 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'
Run Code Online (Sandbox Code Playgroud)