给出了一个mongo集合(为了说明性目的,将其简化为几个字段):
{
"_id" : ObjectId("52402905e4b0cebf1e474093"),
"impressionId" : LUUID("6a46028f-aa02-e87d-c097-01df765ec487"),
"requestTime" : ISODate("2013-09-23T11:41:57.505Z"),
"responseTime" : ISODate("2013-09-23T11:41:57.712Z"),
}我想查询requestTime。理想情况下,我想要两个查询,一个用于精确的requestTime,一个用于范围的requestTimes (大于或等于某个日期时间,小于或等于其他某个日期时间)。到目前为止,我尝试了以下几种方法,但似乎没有一种可行:
def fromDate = new Date(2013, 9, 22, 11, 41, 57)
def fromDateLong = fromDate.getTime()
def toDate = new Date(2013, 9, 23, 11, 41, 58);
def toDateLong = toDate.getTime()
// None of these return a record
def result = db.activityLog.find(requestTime : ['$date' : '2013-09-23T11:41:57.505Z']).count()
def result = db.activityLog.find(requestTime : ['$gte' : fromDateLong, '$lte' : toDateLong]).count()
def result = db.activityLog.find(requestTime : ["\\\$gte" : fromDateLong, "\\\$lte" : toDateLong]).count()
def result = db.activityLog.find(requestTime : ['$gte' : fromDate, '$lte' : toDate]).count()
def result = db.activityLog.find(requestTime : ["\\\$gte" : fromDate, "\\\$lte" : toDate]).count()
// I have also tried to read the first record form the mongo collection pull out the date (which works fine) and then query for this date (which doesn't work):
def result = db.activityLog.findOne()
println result.requestTime // prints correct requestTime
def requestTimeLong = result.requestTime.getTime()
println requestTimeLong // prints correct requestTime
def result2 = db.activityLog.find(requestTime : ["\\\$gte" : requestTimeLong]).count()
def result3 = db.activityLog.find(requestTime : ["\\\$date" : requestTimeLong]).count()
def result4 = db.activityLog.find(requestTime : ["\\\$gte" : result.requestTime]).count()
def result5 = db.activityLog.find(requestTime : ["\\\$date" : result.requestTime]).count()
println result2 // prints 0 for both above queries i.e. no records found
println result3 // prints 0 for both above queries i.e. no records found
println result4 // prints 0 for both above queries i.e. no records found
println result5 // prints 0 for both above queries i.e. no records found有人有什么建议吗?如果能在这方面提供任何帮助,我将不胜感激。
我已经取得了一些进展,但还没有很好地发挥作用。我可以检索记录,提取日期,并在一个有效的查询中使用此日期。但是,如果我试图自己创建日期,它就不起作用:
def result = db.activityLog.findOne(impressionId : ['$exists' : true])
def requestTimeResult = result.requestTime
println requestTimeResult
println requestTimeResult.class
def requestTimeLong = result.requestTime.getTime()
println requestTimeLong
def result2 = db.activityLog.find(requestTime: ['$gte': ['$date' : requestTimeLong]]).count()
def result3 = db.activityLog.find(requestTime: ['$gte': requestTimeResult]).count()
println result2
println result3
def fromDateNew = new Date(2013, 8, 23, 12, 41, 50)
println fromDateNew.class
println fromDateNew
def result4 = db.activityLog.find(requestTime: ['$gte': fromDateNew]).count()
println result4产出:
Mon Sep 23 12:41:50 BST 2013
class java.util.Date
1379936510544
0
196869
class java.util.Date
Sat Aug 23 12:41:50 BST 3913
0发布于 2014-03-28 12:27:21
问题在于日期构造函数。第一个参数不是年份本身,而是1900 +年。这就是当你通过2013年的时候,你得到3913分的原因。更重要的是,从0开始,而不是从1开始-这解释了为什么你得到8月而不是9月。
发布于 2014-03-28 11:36:54
在使用日期时,您基本上“总是”想要执行“范围查询”。除非您绝对知道的实际日期值,否则哪种类型的值不符合要点。因此,即使是像这样的单个值:
"requestTime" : ISODate("2013-09-23T11:41:57.505Z"),您确实希望定义一个“小”范围,可能如下:
db.activityLog.find({
"requestTime": {
"$gte": new Date("2013-09-23 11:41:57"),
"$lt": new Date("2013-09-23 11:41:58")
}
})但是在中,您想要做的事情的实际内容(以及上面的一些说明),您需要做的是在传递到查询时使用“原生”语言平台实现"date“类型。
MongoDB中的日期存储在BSON表示中,这在内部实际上是一个“时代”时间戳。因此,“本地”日期由“驱动程序”转换为此表示形式。当“读取”来自集合的结果时,情况也是如此,因此MongoDB存储的日期被转换为“本机”语言日期格式。
因此,使用“本机”方式而不是将其转换为字符串。ISODate对象类型只是一种表示这些“对象”的mongo "shell“方式。
https://stackoverflow.com/questions/22710955
复制相似问题