MongoDB的/猫鼬在某一特定日期查询?(MongoDB/Mongoose querying at

2019-06-17 18:03发布

是否有可能来查询的具体日期?

我在蒙戈食谱发现,我们可以为一个范围做查询的日期范围一样的是:

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

但有可能是一个特定的日期? 这不起作用:

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

Answer 1:

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

有机会,你节省的日期是new Date()其中包括时间成分。 要查询这些信息,你需要创建一个包含在一天的所有时刻的日期范围倍。

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


Answer 2:

对于我们这些使用Moment.js

const moment = require('moment')

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

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

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

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



Answer 3:

你有没有尝试过:

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

你要碰到的问题是,日期存储为蒙戈时间戳。 所以,以配合你问它来搭配时间戳的日期。 你的情况,我认为你想每天匹配(即从00:00到23:59在特定日期)。 如果您的日期是不保存时间,那么你应该没问题。 否则,请尝试指定的日期在同一天的时间范围(即开始= 00:00,结束= 23:59)如果GTE不起作用。

类似的问题



Answer 4:

是啊,Date对象complects日期和时间,所以只有日期值不工作比较它。

你可以简单地使用$其中运营商表达的JavaScript布尔表达式的条件比较复杂:)

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

created_on是日期时间字段和2012-07-14是否在指定日期。

日期应该是完全在YYYY-MM-DD格式。

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



Answer 5:

您可以使用下面的方法对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'


Answer 6:

我们必须与我们的数据库复制数据的问题,具有多个值的日期字段,我们注定得到1.我以为我想补充,我们解决了这个问题,以供参考方式。

我们有一个名为“数据”与数字“值”字段和日期“日期”字段集合。 我们有我们想到的是幂等过程,但最终向每对第二轮第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



文章来源: MongoDB/Mongoose querying at a specific date?