Я пытаюсь написать запрос с помощью Golang, где я буду фильтровать действия, созданные сегодня для определенного идентификатора профиля, и давать мне счет. Проблема в том, что я не знаю, как написать фильтр, который бы отфильтровывал элементы из определенного диапазона времени. И я не могу найти подходящего решения, где использовались Golang и MongoDB.
Поле метки времени в структуре Action — это дата создания, которую необходимо использовать для фильтрации действий, созданных в этот день.
Если бы кто-нибудь мог помочь мне и поставить меня на правильный путь, я был бы очень признателен. Спасибо.
Вот мой код:
type Action struct {
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
ProfileID primitive.ObjectID `json:"profileID,omitempty" bson:"profileID,omitempty"`
Timestamp time.Time `json:"timestamp,omitempty" bson:"timestamp,omitempty"`
TypeID int `json:"type" bson:"type"`
}
func MatchActionAmount(profileId primitive.ObjectID) (int64, error) {
filter := bson.M{"profileID": profileId}
count, err := getActionCountByFilter(filter)
if err != nil {
log.Error("Could not get action count, error: ", err)
return 0, err
}
return count, nil
}
func getActionCountByFilter(filter primitive.M) (int64, error) {
ctx, _ := db.GetTimeoutContext()
return getActionCollection().CountDocuments(ctx, filter)
}
func getActionCollection() *mongo.Collection {
return db.GetMongoCollection("action")
}
Если отметка времени всегда является датой создания (это не может быть отметка времени в будущем), вам действительно не нужен фильтр диапазона (между), вам нужны только записи, где отметка времени создания больше, чем сегодня, 0:00.
Вот как это может выглядеть:
now := time.Now()
year, month, day := now.Date()
today := time.Date(year, month, day, 0, 0, 0, 0, now.Location())
filter := bson.M{
"profileID": profileId,
"timestamp": bson.M{
"$gte": today,
},
}
(Примечание: если вы хотите, чтобы дни интерпретировались в формате UTC, используйте now.UTC().Date()
и time.UTC
для местоположения.)
Если вы хотите написать запрос диапазона, в котором вам нужно ограничить timestamp
двумя временными метками, это может выглядеть так (этот запрос ограничивает временные метки между сегодняшним 0:00 и завтрашним 0:00, то есть в основном весь день сегодня):
filter := bson.M{
"profileID": profileId,
"timestamp": bson.M{
"$gte": today,
"$lt": today.AddDate(0, 0, 1),
},
}