mgo:查询ObjectId的时间范围值

时间:2015-07-19 14:22:47

标签: go mgo

好的,说你有很多帖子

type Post struct {
    Id bson.ObjectId `bson:"_id,omitempty"`
}

并且每个帖子当然都有一个在特定时间创建的唯一ID。

我可以使用post.Id.Time()获取时间值。

但是,我如何查询来自2015年的帖子?

从01.01.2014-31.12.2015开始,我将如何对帖子进行范围查询?

我认为我需要迭代结果,检查post.Id.Time()是否在01.01.2014和2015年12月31日之间以及是否将其添加到帖子切片。

使用mgo驱动程序搜索某些范围之间或特定日期之间的帖子是否有一种不太复杂的方式?

如果没有,我会接受否作为答案。如果有,我会接受并回答说明如何,用代码示例。

我在Stackoverflow上发现了这篇文章:1

但是,我不知道这将如何应用于bson.ObjectId,因为它们输入的时间不是时间。但是bson.ObjectId。

2 个答案:

答案 0 :(得分:1)

这是你怎么做的。

  • 汇编fromDate和toDate。
  • 使用bson.ObjectId
  • 创建bson.NewObjectIdWithTime()
  • 查询日期范围

示例:查询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 ObjectId来自ISODate

} ServerName

答案 1 :(得分:0)

您应该在文档中添加date字段,您可以在其中查询。这是最简单的选择。

type Post struct {
    Id bson.ObjectId `bson:"_id"`
    date time.Time `bson:"date"`
}

然后,您可以在日期对象上编写查询。