如何在官方 MongoDB Go 驱动程序上查找和比较日期?

问题描述 投票:0回答:2

我是 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 go mongo-go
2个回答
5
投票

我的 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)

1
投票

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版本中被删除:(

© www.soinside.com 2019 - 2024. All rights reserved.