我正在尝试使用 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.Time
为primitive.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)
由于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)
归档时间: |
|
查看次数: |
18317 次 |
最近记录: |