mgo:查询 ObjectId 的时间值范围
mgo: Query ObjectId for range of time values
好的,假设您有多个 post
type Post struct {
Id bson.ObjectId `bson:"_id,omitempty"`
}
当然每个 post 都有一个在特定时间创建的唯一 ID。
我可以用post.Id.Time()
获取时间值。
但是,我如何查询 posts 从比方说 2015 年开始?
自 2014 年 1 月 1 日至 2015 年 12 月 31 日以来,我将如何对 post 进行范围查询?
我假设我需要迭代结果,检查 post.Id.Time()
是否在 2014 年 1 月 1 日和 2015 年 12 月 31 日之间,以及是否将其添加到 posts 切片。
是否有更简单的方法来使用 mgo 驱动程序搜索在特定范围内或在特定日期生成的 posts?
如果没有,我会接受否作为答案。如果有,我会接受并回答说明如何使用代码示例。
我在 Whosebug 上找到了这个 post:1
但是我不知道这将如何应用于 bson.ObjectId,因为他们键入的不是 time.Time,而是 bson.ObjectId。
你应该在文档中添加一个date
字段,你可以通过它进行查询。这是最简单的选择。
type Post struct {
Id bson.ObjectId `bson:"_id"`
date time.Time `bson:"date"`
}
然后您可以在日期对象上编写查询。
这是您的操作方法。
- Assemble fromDate 和 toDate。
- 用
bson.NewObjectIdWithTime()
创建 bson.ObjectId
- 查询日期范围
示例:查询 2015 年创建的帖子
year := 2015
fromDate := time.Date(year, time.January, 1, 0, 0, 0, 0, time.UTC)
toDate := time.Date(year+1, time.January, 1, 0, 0, 0, 0, time.UTC)
fromId := bson.NewObjectIdWithTime(fromDate)
toId := bson.NewObjectIdWithTime(toDate)
posts := []*Post{}
if e := cPost.Find(bson.M{"_id": bson.M{"$gte": fromId, "$lt": toId}}).All(&posts); e != nil {
}
注意:因为 ObjectId
不是 ISODate
assemble ObjectId
来自 ISODate
好的,假设您有多个 post
type Post struct {
Id bson.ObjectId `bson:"_id,omitempty"`
}
当然每个 post 都有一个在特定时间创建的唯一 ID。
我可以用post.Id.Time()
获取时间值。
但是,我如何查询 posts 从比方说 2015 年开始?
自 2014 年 1 月 1 日至 2015 年 12 月 31 日以来,我将如何对 post 进行范围查询?
我假设我需要迭代结果,检查 post.Id.Time()
是否在 2014 年 1 月 1 日和 2015 年 12 月 31 日之间,以及是否将其添加到 posts 切片。
是否有更简单的方法来使用 mgo 驱动程序搜索在特定范围内或在特定日期生成的 posts?
如果没有,我会接受否作为答案。如果有,我会接受并回答说明如何使用代码示例。
我在 Whosebug 上找到了这个 post:1
但是我不知道这将如何应用于 bson.ObjectId,因为他们键入的不是 time.Time,而是 bson.ObjectId。
你应该在文档中添加一个date
字段,你可以通过它进行查询。这是最简单的选择。
type Post struct {
Id bson.ObjectId `bson:"_id"`
date time.Time `bson:"date"`
}
然后您可以在日期对象上编写查询。
这是您的操作方法。
- Assemble fromDate 和 toDate。
- 用
bson.NewObjectIdWithTime()
创建 - 查询日期范围
bson.ObjectId
示例:查询 2015 年创建的帖子
year := 2015
fromDate := time.Date(year, time.January, 1, 0, 0, 0, 0, time.UTC)
toDate := time.Date(year+1, time.January, 1, 0, 0, 0, 0, time.UTC)
fromId := bson.NewObjectIdWithTime(fromDate)
toId := bson.NewObjectIdWithTime(toDate)
posts := []*Post{}
if e := cPost.Find(bson.M{"_id": bson.M{"$gte": fromId, "$lt": toId}}).All(&posts); e != nil {
}
注意:因为 ObjectId
不是 ISODate
assemble ObjectId
来自 ISODate