由于缺少“ISODate”,Golang + mgo查询mongodb在使用时失败

时间:2016-09-08 07:44:26

标签: mongodb go time mgo gorilla

我有以下代码从我的mongodb中检索一些数据 -

currentDate := time.Now().Format(time.RFC3339)
content := database.FindDocuments("content", bson.M{ "$and": []bson.M{ bson.M{"start_date": bson.M{"$lte": currentDate}}, bson.M{"end_date": bson.M{ "$gte": currentDate}}, }})

FindDocuments基本上MgoSession.DB(Dbname).C(collectionName).Find(query).All(&result)给了我一个[]map[string]interface{}

这给了我null,而在mongo控制台中(使用与currentDate变量返回的值相同) -

{ "start_date": { $lt: ISODate("2016-09-08T13:05:24+05:30") }, $and: [ { "end_date": { $gt: ISODate("2016-09-08T13:05:24+05:30") } } ] }

返回我 -

{ 
    "_id" : ObjectId("57cff2bc32291a1fa0e79e90"), 
    "image_url" : "www.example.com", 
    "title" : "This is a new content", 
    "start_date" : ISODate("2016-09-06T10:58:54.701+0000"), 
    "end_date" : ISODate("2016-09-10T10:59:04.447+0000"), 
    "type" : "content"
}

尽管使用了正确的时间格式,为什么会出现此问题?

1 个答案:

答案 0 :(得分:2)

mgo驱动程序似乎很聪明,可以正确转换time.Time到mongo Date所以只是

currentDate := time.Now()

应该有效。另外gopkg.in/mgo.v2/bson有帮手可以获得mongo使用的毫秒精度时间

func Now() time.Time

所以

currentDate := bson.Now()

这个辅助函数有简单的源

return time.Unix(0, time.Now().UnixNano()/1e6*1e6)

这样任何Go时间戳time.Time都可以以毫秒

获得
someDate := time.Unix(0, time.someTime.UnixNano()/1e6*1e6)