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

时间:2018-10-04 01:32:44

标签: mongodb go mongo-go

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

我在类似这样的结构中有一个日期:

TIME: 8.748245699999984 seconds
SUM: 4999999950000000

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

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

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

我在做什么错了?

2 个答案:

答案 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()