我是mongodb-go-driver的新手,被困住了。
我在类似这样的结构中有一个日期:
TIME: 8.748245699999984 seconds
SUM: 4999999950000000
我的mongoDB上的日期和映射到我的结构中的日期的值都类似于“ 02/10/2018 11:55:20”。
我想在我的数据库中找到Date在另一个日期之后的元素,我正在尝试这样做,但是响应始终为空。
type Email struct {
Date string `json:"date"`
}
我在做什么错了?
答案 0 :(得分:1)
我的mongoDB上的日期和映射到我的结构中的日期的值都类似于“ 02/10/2018 11:55:20”。
您可以采取多种方法。如评论中所述,第一种方法是将string
日期转换为实际日期格式。另请参见MongoDB Date。建议以正确的日期格式存储日期值以提高性能。
如果您有文档:
{ "a": 1, "b": ISODate("2018-10-02T11:55:20Z") }
使用mongo-go-driver(当前v0.0.15),您可以执行以下操作来查找和比较使用日期:
initDate, err := time.Parse("02/01/2006 15:04:05", "01/10/2018 11:55:20")
filter := bson.VC.DocumentFromElements(
bson.EC.SubDocumentFromElements(
"b",
bson.EC.Time("$gt", initDate),
),
)
cursor, err := collection.Find(context.Background(), filter)
请注意上面示例中time.Parse()
的布局值。它需要匹配字符串的布局/格式。
不转换值的另一种方法是使用MongoDB Aggregation Pipeline。您可以使用$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
addFields := bson.VC.DocumentFromElements(
bson.EC.SubDocumentFromElements(
"$addFields",
bson.EC.SubDocumentFromElements(
"newdate",
bson.EC.SubDocumentFromElements(
"$dateFromString",
bson.EC.String("dateString", "$b"),
bson.EC.String("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
match := bson.VC.DocumentFromElements(
bson.EC.SubDocumentFromElements(
"$match",
bson.EC.SubDocumentFromElements(
"newdate",
bson.EC.Time("$gt", initDate),
),
),
)
pipeline := bson.NewArray(addFields, match)
cursor, err := collection.Aggregate(context.Background(), pipeline)
答案 1 :(得分:0)
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 毫秒。
您可以使用 time.Time
email.Date.Time()