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"`
}
Затем вы можете написать свои запросы к объекту даты.