Gmongo日期查询

时间:2014-03-28 10:59:52

标签: mongodb gmongo

给定一个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

2 个答案:

答案 0 :(得分:2)

你几乎"总是" 想做一个"范围查询"使用日期时。除非你绝对 知道实际日期值,否则哪种方法会失败。所以即使对于像这样的单一值:

"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")
    }
})

但在实际内容中,您似乎正在尝试做什么(以及上面说明的内容)需要要做的是使用&# 34;本地" 语言平台实施" date"传入查询时输入。

MongoDB中的日期存储在BSON表示中,该表示实际上是" epoch"内部时间戳。那么你的本土"日期由"驱动程序"转换。进入这个表示。当阅读"同样的情况也是如此。来自集合的结果,因此MongoDB存储的日期将转换为您的" native"语言日期格式。

所以使用" native"而不是转换为字符串。 ISODate对象类型只是一个mongo" shell"表示这些"对象的方式"。

答案 1 :(得分:1)

问题在于Date constructor。第一个参数不是年份本身,它是1900年+年。这就是为什么当你通过2013年时你获得3913的原因。从0开始的月份开始的时间更长 - 这就解释了为什么你得到8月而不是9月。