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?

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

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

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


person Community    schedule 19.07.2015    source источник


Ответы (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

person Community    schedule 21.07.2015

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

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

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

person Sundar    schedule 19.07.2015