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