MongoDB / Mongoose在特定date查询?

有没有可能查询一个特定的date?

我在mongo Cookbook中发现,我们可以在范围内查询date范围。就像这样:

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

但是,具体date有可能吗? 这不起作用:

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

如果您保存在数据库中的date没有时间(只是日,月,年),那么这应该起作用。

机会是你保存的date是new Date() ,其中包括时间组件。 要查询这些时间,您需要创build一个包含一天中所有时间的date范围。

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

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

 var today = moment().startOf('day') var tomorrow = moment(today).add(1, 'days') MyModel.find({ createdAt: { $gte: today.toDate(), $lt: tomorrow.toDate() } }) 

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

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

是的,Date对象完成date和时间,所以与date值比较是行不通的。

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

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

created_on是date时间字段, 2012-07-14是指定的date。

date应该完全是YYYY-MM-DD格式。

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

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

 # [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' 

你有没有尝试过:

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

您将要遇到的问题是date在Mongo中存储为时间戳。 所以,要匹配一个date,你要求它匹配一个时间戳。 在你的情况下,我认为你想匹配一天(即在特定的date从00:00到23:59)。 如果你的date存储没有时间,那么你应该没问题。 否则,如果gte不起作用,请尝试在同一天将date指定为一个时间范围(例如,开始= 00:00,结束= 23:59)。

类似的问题

我们在数据库中有一个与重复数据有关的问题,其中一个date字段有多个值,我们的意思是1.我想我会添加我们解决问题的方式作为参考。

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

 { "_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条logging中的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