Перейти фильтровать mongoDB по диапазону дат

Я пытаюсь написать запрос с помощью 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")
}
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если отметка времени всегда является датой создания (это не может быть отметка времени в будущем), вам действительно не нужен фильтр диапазона (между), вам нужны только записи, где отметка времени создания больше, чем сегодня, 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),
    },
}

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