如何用golang和mongodb过滤日期?

gin*_*nad 10 go mongodb

我正在尝试使用 golang 从 mongodb 查询记录,但似乎不起作用。我尝试使用 ISODate() 通过 mongo cli 运行查询,它可以工作,但我不确定如何使用 golang 调用 ISODate。下面是我正在运行的代码片段。

type Record struct{
    ID         primitive.ObjectID `bson:"_id"`
    PropertyID primitive.ObjectID `bson:"propertyID"`
    CreatedAt  primitive.DateTime `bson:"createdAt"`
}
// ....
cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
    "$gte": time.Now().UTC().AddDate(-1, 0, 0).Format(time.RFC3339),
}})
// ....
var recs []Record
err = cur.All(ctx, &recs)
Run Code Online (Sandbox Code Playgroud)

如果我运行,len(recs)我会得到 0 但在 mongo-cli 中,当我运行下面的代码时,我会得到结果。

db.getCollection('records').find({
    createdAt: {
        $gte: ISODate("2019-11-02T23:16:58+08:00")
    }
}).sort({createdAt: -1})
Run Code Online (Sandbox Code Playgroud)

顺便说一句2019-11-02T23:16:58+08:00是输出time.Now().UTC().AddDate(-1, 0, 0).Format(time.RFC3339)

预先感谢大家:D

Coc*_*nut 16

尝试primitive.NewObjectIDFromTimestamp

从那里您可以转换time.Timeprimitive.ObjectID,反之亦然。

func NewObjectIDFromTimestamp(timestamp time.Time) ObjectID
Run Code Online (Sandbox Code Playgroud)

NewObjectIDFromTimestamp 根据给定时间生成新的 ObjectID。

或者primitive.NewDateTimeFromTime,它创建了一个DateTime.

func NewDateTimeFromTime(t time.Time) DateTime
Run Code Online (Sandbox Code Playgroud)

NewDateTimeFromTime 从时间创建新的日期时间。

然后将其传递给您的查询过滤器,如下所示:

cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
    "$gte": primitive.NewDateTimeFromTime(time.Now().AddDate(-1, 0, 0)),
}})
Run Code Online (Sandbox Code Playgroud)


Din*_*wda 5

由于CreatedAt是 类型primitive.Datetime,因此在您的bson.M查询中CreatedAt您需要传递primitive.Datetime对象。

Golang 的 mongo 驱动程序为您处理编组。

cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
    "$gte": primitive.NewDateTimeFromTime(time.Now())
}})
Run Code Online (Sandbox Code Playgroud)