0

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 を照会したい。理想的には、2 つのクエリが必要です。1 つは正確な requestTime 用で、もう 1 つは requestTime の範囲 (ある日時以上で他の日時以下) 用です。私はこれまでに次のことを試しましたが、どれもうまくいかないようです:

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
4

2 に答える 2

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

しかし、あなたがやろうとしているように見える(そして上に示したような)実際の内容では、クエリに渡すときに「日付」タイプの「ネイティブ」言語プラットフォーム実装を使用する必要があります。

MongoDB の日付は、実際には内部的に「エポック」タイムスタンプである BSON 表現で保存されます。したがって、「ネイティブ」の日付は「ドライバー」によってこの表現に変換されます。コレクションから結果を「読み取る」場合も同様であるため、MongoDB が格納する日付は「ネイティブ」言語の日付形式に変換されます。

そのため、文字列に変換するのではなく、「ネイティブ」な方法を使用してください。オブジェクト型は、ISODateこれらの「オブジェクト」を表す mongo の「シェル」の方法にすぎません。

于 2014-03-28T11:36:54.810 に答える