2

我是 mongodb-go-driver 的新手,我被卡住了。

我在结构中有一个日期,例如:

type Email struct {
    Date        string            `json:"date"`
}

我的 mongoDB 上的日期和我的结构中映射的日期具有类似“02/10/2018 11:55:20”的值。

我想在我的数据库中找到日期在另一个日期之后的元素,我正在尝试这个,但响应始终为空。

initDate, _ := time.Parse("02012006", initialDate)
cursor, err := emails.Find(context.Background(), bson.NewDocument(bson.EC.SubDocumentFromElements("date", bson.EC.DateTime("$gt", initDate.Unix()))))

我究竟做错了什么?

4

2 回答 2

4

我的 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 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
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)
于 2018-10-09T12:21:21.000 回答
0

不稳定的bsonxmongodb-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.Timeemail.Date.Time()

于 2021-01-05T20:25:53.453 回答