Запрос mongodb даты между диапазонами дат, используя golang mgo - PullRequest
0 голосов
/ 29 июня 2018

Я пытался следовать решению, упомянутому здесь Как я могу запросить MongoDB с диапазоном дат, используя mgo и Go? , но я не могу получить результаты для диапазона dob. «dob» в mongodb хранится как:

"dob": {
    "$date": "1967-06-28T00:00:00.000Z"
}

Без запроса dob все работает нормально. Я пытался переключить $ lt и $ gt, но все же не повезло. Кто-нибудь знает, как заставить это работать? Я распечатал dobLower и dobUpper, и они, похоже, являются действительными датами вроде 2000-06-28 21:57:06.666025643 +0000 UTC. Модель для Доб Dob time.Time json:"dob" bson:"dob"

ageLower, err := strconv.Atoi(filters["ageLower"])
ageUpper, err := strconv.Atoi(filters["ageUpper"])
heightLower, err := strconv.Atoi(filters["heightLower"])
heightUpper, err := strconv.Atoi(filters["heightUpper"])
if err != nil {
    return nil, err
}

dobUpper := time.Now().AddDate(-ageLower, 0, 0)
dobLower := time.Now().AddDate(-ageUpper, 0, 0)

pColl := s.DB("mydb").C("profiles")

query := bson.M{
    "$and": []bson.M{
        bson.M{"active": bson.M{"$eq": true}},
        bson.M{"gender": bson.M{"$ne": u.Gender}},
        bson.M{"_id": bson.M{"$nin": u.HiddenProfiles}},
        bson.M{"_id": bson.M{"$ne": u.ProfileID}},
        bson.M{"dob": bson.M{"$gt": dobLower , "$lt": dobUpper}},
        bson.M{"height": bson.M{"$gt": heightLower, "$lt": heightUpper}},
    },
}

return pColl.Find(query).Select(bson.M{"first_name": 0}).All(&profiles)

Помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Если вы храните даты как int64, вы можете использовать $ lt и т. Д. Для сравнения целых чисел, но сначала вам нужно будет добавить в поле даты как int64. Для этого переберите коллекцию и используйте время, чтобы преобразовать дату из строки в int64, создав время и получив из него количество секунд. При добавлении новых дат также сохраните его как int64. Сравнения Int будут быстрее, и если вы их индексируете, индекс будет меньше текстового.

iter := pColl.Find(nil).Iter()
for iter.Next(&profile){
    t, _ := time.Parse(time.RFC3339, profile.DOB)
    x := t.Unix()
    theUpdate := bson.M{"$set": bson.M{"dobint": x}}
    pColl.UpdateId(profile.ID, theUpdate)
}
iter.Close()
...