我是 mongodb-go-driver 的新手,我被困住了。
我在结构中有一个日期,例如:
type Email struct {
Date string `json:"date"`
}
我的 mongoDB 上的日期和映射到我的结构中的日期具有类似于“02/10/2018 11:55:20”的值。
我想在我的数据库中找到 Date 在其他日期之后的元素,我正在尝试此操作,但响应始终为空。
initDate, _ := time.Parse("02012006", initialDate)
cursor, err := emails.Find(context.Background(), bson.NewDocument(bson.EC.SubDocumentFromElements("date", bson.EC.DateTime("$gt", initDate.Unix()))))
我做错了什么?
我的 mongoDB 上的日期和映射到我的结构中的日期具有类似于“02/10/2018 11:55:20”的值。
您可以采取多种方法。正如评论中提到的,第一个是将
string
日期转换为实际日期格式。另请参阅MongoDB 日期。以正确的日期格式存储日期值是提高性能的推荐方法。
如果您有文件:
{ "a": 1, "b": ISODate("2018-10-02T11:55:20Z") }
使用 mongo-go-driver(当前 v1.2.x),您可以执行以下操作来查找和比较使用日期:
initDate, err := time.Parse("02/01/2006 15:04:05", "01/10/2018 11:55:20")
filter := bson.D{
{"b", bson.D{
{"$gt", initDate},
}},
}
cursor, err := collection.Find(context.Background(), filter)
请注意上面示例中
time.Parse()
的布局值。它需要匹配字符串布局/格式。
另一种无需转换值的方法是使用 MongoDB 聚合管道。您可以使用 $dateFromString 运算符将
string
日期转换为日期,然后使用 $match 阶段按日期进行过滤。
例如,给定文档:
{ "a": 1, "b": "02/10/2018 11:55:20" }
{ "a": 2, "b": "04/10/2018 10:37:19" }
您可以尝试:
// Add a new field called 'newdate' to store the converted date value
addFieldsStage := bson.D{
{"$addFields", bson.D{
{"newdate", bson.D{
{"$dateFromString", bson.D{
{"dateString", "$b"},
{"format", "%d/%m/%Y %H:%M:%S"},
}},
}},
}},
}
initDate, err := time.Parse("02/01/2006 15:04:05", "02/10/2018 11:55:20")
// Filter the newly added field with the date
matchStage := bson.D{
{"$match", bson.D{
{"newdate", bson.D{
{"$gt", initDate},
}},
}},
}
pipeline := mongo.Pipeline{addFieldsStage, matchStage}
cursor, err := collection.Aggregate(context.Background(), pipeline)
bsonx
中不稳定的mongodb-go-driver
包有一个DateTime
类型。
您可以像这样在结构中添加字段:
type Email struct {
Date bsonx.Val
}
要声明结构,请使用
bsonx.DateTime(millis int64)
:
Email{
Date: bsonx.DateTime(time.Now().UnixNano()/1e6)
}
*
time.Now().UnixNano()/1e6
基本上得到了unix millis。
您可以使用
time.Time
将其转换为
email.Date.Time()
它在1.12版本中被删除:(