douju3911 2018-06-28 22:31
浏览 695
已采纳

使用Golang mgo查询日期范围之间的mongodb日期

I've tried following the solution mentioned here How can I query MongoDB with date range using mgo and Go? but I can't seem to get results for the dob range. "dob" in mongodb is stored as:

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

Without the dob query it works fine. I've tried switching $lt and $gt but still no luck. Does anyone know how to get this working? I've printed out dobLower and dobUpper and they both seem to be valid dates like 2000-06-28 21:57:06.666025643 +0000 UTC. The model for dob is 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)

Help will be much appreciated. Thanks.

  • 写回答

1条回答 默认 最新

  • duanlei1957 2018-06-28 23:02
    关注

    If you store your dates as int64s you can use $lt etc with an integer comparison, but first you will have to add in a field of the date as an int64. To do this iterate over the collection and use time to convert the date from string to int64 by creating a time then getting the number of seconds from it. When adding new dates also save it as int64. Int comparisons will be quicker and if you index it the index would be smaller than a text one.

    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()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 STM32L431RCT6 定时器2中断发起ADC 采样问题
  • ¥15 如何通过交互分析得出某高危患者对放疗获益更多
  • ¥15 相关性分析中,p<0.05, r=0.29,怎么评价相关性呢
  • ¥15 docker部署Mongodb后输入命令报错?
  • ¥15 将下列流程图转变成python程序代码
  • ¥15 我需要全国每个城市的最新小区名字等数据。
  • ¥15 开发一个小区生态的小程序
  • ¥15 如何解决Excel中dependent dropdown list 的问题
  • ¥15 MddBootstrapInitialize2失败
  • ¥15 LCD Flicker