Mongodb Gmongo日期查询

Mongodb Gmongo日期查询,mongodb,gmongo,Mongodb,Gmongo,给定一个mongo集合(为了便于说明,仅拆分为几个字段): 我想查询请求时间。理想情况下,我需要两个查询,一个用于精确的requestTime,另一个用于一系列requestTime(大于或等于某个datetime,小于或等于某个其他datetime)。到目前为止,我已经尝试了以下方法,但似乎都不起作用: def fromDate = new Date(2013, 9, 22, 11, 41, 57) def fromDateLong = fromDate.getTime() def toDat

给定一个mongo集合(为了便于说明,仅拆分为几个字段):

我想查询请求时间。理想情况下,我需要两个查询,一个用于精确的requestTime,另一个用于一系列requestTime(大于或等于某个datetime,小于或等于某个其他datetime)。到目前为止,我已经尝试了以下方法,但似乎都不起作用:

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
在使用日期时,您几乎“总是”希望执行“范围查询”。除非你绝对知道实际的日期值,否则哪种类型的日期值不符合要点。因此,即使对于这样的单个值:

“请求时间”:ISODate(“2013-09-23T11:41:57.505Z”),
您确实希望定义一个“小”范围,可能如下所示:

db.activityLog.find({
“请求时间”:{
“$gte”:新日期(“2013-09-23 11:41:57”),
“$lt”:新日期(“2013-09-23 11:41:58”)
}
})
但是在实际的内容中,您似乎正在尝试做的事情(以及上面的说明),您需要做的事情是在传递到查询时使用您的“本机”语言平台实现“日期”类型

MongoDB中的日期存储在BSON表示形式中,该表示形式实际上是内部的“历元”时间戳。因此,您的“本地”日期由“驱动程序”转换为此表示形式。当从集合中“读取”结果时也是如此,因此MongoDB存储的日期将转换为您的“本地”语言日期格式

因此,请使用“本机”方式,而不是转换为字符串。
ISODate
对象类型只是一种表示这些“对象”的mongo“shell”方式。

在使用日期时,您几乎“总是”想要执行“范围查询”。除非你绝对知道实际的日期值,否则哪种类型的日期值不符合要点。因此,即使对于这样的单个值:

“请求时间”:ISODate(“2013-09-23T11:41:57.505Z”),
您确实希望定义一个“小”范围,可能如下所示:

db.activityLog.find({
“请求时间”:{
“$gte”:新日期(“2013-09-23 11:41:57”),
“$lt”:新日期(“2013-09-23 11:41:58”)
}
})
但是在实际的内容中,您似乎正在尝试做的事情(以及上面的说明),您需要做的事情是在传递到查询时使用您的“本机”语言平台实现“日期”类型

MongoDB中的日期存储在BSON表示形式中,该表示形式实际上是内部的“历元”时间戳。因此,您的“本地”日期由“驱动程序”转换为此表示形式。当从集合中“读取”结果时也是如此,因此MongoDB存储的日期将转换为您的“本地”语言日期格式

因此,请使用“本机”方式,而不是转换为字符串。
ISODate
对象类型只是一种表示这些“对象”的mongo“shell”方式。

在使用日期时,您几乎“总是”想要执行“范围查询”。除非你绝对知道实际的日期值,否则哪种类型的日期值不符合要点。因此,即使对于这样的单个值:

“请求时间”:ISODate(“2013-09-23T11:41:57.505Z”),
您确实希望定义一个“小”范围,可能如下所示:

db.activityLog.find({
“请求时间”:{
“$gte”:新日期(“2013-09-23 11:41:57”),
“$lt”:新日期(“2013-09-23 11:41:58”)
}
})
但是在实际的内容中,您似乎正在尝试做的事情(以及上面的说明),您需要做的事情是在传递到查询时使用您的“本机”语言平台实现“日期”类型

MongoDB中的日期存储在BSON表示形式中,该表示形式实际上是内部的“历元”时间戳。因此,您的“本地”日期由“驱动程序”转换为此表示形式。当从集合中“读取”结果时也是如此,因此MongoDB存储的日期将转换为您的“本地”语言日期格式

因此,请使用“本机”方式,而不是转换为字符串。
ISODate
对象类型只是一种表示这些“对象”的mongo“shell”方式。

在使用日期时,您几乎“总是”想要执行“范围查询”。除非你绝对知道实际的日期值,否则哪种类型的日期值不符合要点。因此,即使对于这样的单个值:

“请求时间”:ISODate(“2013-09-23T11:41:57.505Z”),
您确实希望定义一个“小”范围,可能如下所示:

db.activityLog.find({
“请求时间”:{
“$gte”:新日期(“2013-09-23 11:41:57”),
“$lt”:新日期(“2013-09-23 11:41:58”)
}
})
但是在实际的内容中,您似乎正在尝试做的事情(以及上面的说明),您需要做的事情是在传递到查询时使用您的“本机”语言平台实现“日期”类型

MongoDB中的日期存储在BSON表示形式中,该表示形式实际上是内部的“历元”时间戳。因此,您的“本地”日期由“驱动程序”转换为此表示形式。当从集合中“读取”结果时也是如此,因此MongoDB存储的日期将转换为您的“本地”语言日期格式

因此,请使用“本机”方式,而不是转换为字符串。ISODate对象类型只是一种表示这些“对象”的mongo“shell”方式。

问题在于。第一个参数不是年份本身,而是1900+年。这就是为什么当你通过2013年时会得到3913分。更重要的是,一个月从0开始,而不是从1开始
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