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

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

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题