2017-08-25 16 views
1

タイムスタンプが10秒未満のすべてのmongo dbドキュメントを取得しようとしています。私は何も見つけていない。これは私の時間形式が正しくないためだと思います。私はそれらがシェルからmongo dbを照会しているのを見つけていませんdb.mgo.find({タイムスタンプ:{$ gt:new Date(ISODate() - getTime() - 86400}}})最後の24時間。タイムスタンプが10秒未満のすべてのmongo dbドキュメントを見つける

// FindLast 10min 
func FindLast(session *mgo.Session, db, collection string) ([]Syslog, error) { 
    var results []Syslog 
    t := time.Now().Add(-10 * time.Second) 
    c := session.DB(db).C(collection) 
    err := c.Find(
    bson.M{ 
     "timestamp": bson.M{ 
      "$gt": t,   
     }, 
    }).All(&results) 
    return results, err 
} 

私は文書のObjectId( "... ")のいずれかを選択した場合getTimestamp()それはISODate示しています。(" 2017-08-25T19:14:54Z")ましたそれはUTCなので、私より4時間前です。しかし、私はそれはまだすべての文書

t := time.Now().UTC().Add(-time.Duration(10)*time.Minute).Format("2006-01-02 15:04:05") 
+1

DBのレコードはどのように見えますか? – Adrian

+0

{ "_id":のObjectId( "59a0772efd461bcedc236efa")、 "ドメイン": "<141> 8月25日午前19時14分54秒DC 1"、 "receivetime": ""、 "タイプ": "脅威"、 "sourceip": "152.152.152.152"、 "destinationip": "2.2.2.2"、 "application": "App test"、 "destinationport": "22222"、 ""reportid": "" "カテゴリ": "任意"、 "重大度": "低"、 "脅威コンテンツ名" – irom

答えて

1

を見つけていない、私のFUNCにUTCに変更しかし、私は私のFUNCにUTCに変更した場合でも、それはまだすべての文書

を見つけていない場合でも、これは、文書内にフィールドtimestampはありません。使用しているクエリの構文は、select all documents where timestamp is greater than T from the collectionと同じです。

あなたがしたいことは、getTimestamp()メソッドを使用するすべてのドキュメントのObjectIdから派生したタイムスタンプ値を使用することです。このような場合は、あなたがmgo/bson機能を利用することができますNewObjectIdWithTime()は、以下のように例を参照してください。

currentTime := time.Now() 
queryTime := currentTime.Add(-10 * time.Second) 

// Generate a dummy ObjectId with a specified timestamp for querying 
var oidtime = bson.NewObjectIdWithTime(queryTime) 
query := bson.M{"_id": bson.M{"$gt": oidtime}} 
err := collection.Find(query).All(&documents) 

上記の代わりに、私たちが照会したObjectIdを利用して照会する時間を使っての、あなたの照会を逆転させました。それ以外の場合は、すべてのドキュメントを取得し、ObjectIdをタイムスタンプに変換して比較する必要があります。これは効率的ではありません。

また、$currentDate operator を使用して、各ドキュメントにtimestamp値を追加して、フィールドの値を現在の日付に設定することもできます。

関連する問題