mgo: запрос ObjectId для диапазона значений времени

Хорошо, скажем, у вас есть ряд сообщений

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

и каждый пост, конечно, имеет уникальный идентификатор, который был создан в определенное время.

Я могу получить значение времени с post.Id.Time(),

Однако, как я могу запросить сообщения, скажем, 2015 года?

И как бы я сделал запрос диапазона для сообщений с 01.01.2014-31.12.2015?

Я хотел бы предположить, что мне нужно перебрать результаты, проверьте, если post.Id.Time() в период с 01.01.2014 по 31.12.2015 и, если он есть, добавьте его в секцию сообщений.

Есть ли менее сложный способ поиска сообщений, сделанных между определенными диапазонами или на определенную дату, используя драйвер mgo?

Если нет, я приму Нет как ответ. Если есть, я приму и отвечу, что показывает, как, с примером кода.

Я нашел этот пост на Stackru: 1

Однако я не знаю, как это будет применяться к bson.ObjectId, поскольку они вводят не time.Time, а bson.ObjectId.

2 ответа

Решение

Вот как ты это делаешь.

  • Соберите 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

Вы должны добавить date поле в документы, по которым вы можете запросить. Это самый простой вариант.

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

Затем вы можете написать свои запросы к объекту даты.

Другие вопросы по тегам