使用 golang mgo 查询日期范围之间的 mongodb 日期
Querying mongodb date between date range using golang mgo
我已经尝试按照此处提到的解决方案 How can I query MongoDB with date range using mgo and 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 的模型是
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)
非常感谢您的帮助。谢谢。
如果您将日期存储为 int64,则可以使用 $lt 等进行整数比较,但首先您必须将日期字段添加为 int64。为此,遍历集合并使用时间通过创建时间然后从中获取秒数将日期从字符串转换为 int64。添加新日期时也将其保存为 int64。整数比较会更快,如果你索引它,索引会比文本索引小。
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()
替代解决方案是将字符串转换为 ISO 日期格式。
collection := client.Database("Hello").Collection("demo")
eventStartTime := "2013-10-01T01:11:18.965Z" //string format
eventEndTime := "2014-12-03T01:11:18.965Z" //string format
const (
layoutISO = "2006-01-02T15:04:05.000Z"
)
//import "time" package.
t1, _ := time.Parse(layoutISO, eventStartTime) //converted to ISODate format
t2, _ := time.Parse(layoutISO, eventEndTime) //converted to ISODate format
//fmt.Println(t1)
filterCursor, err := collection.Find(context.TODO(), bson.M{"sentat": bson.M{"$gt": t1, "$lt": t2}})
if err != nil {
log.Fatal(err)
}
var result []bson.M
if err = filterCursor.All(context.TODO(), &result); err != nil {
log.Fatal(err)
}
fmt.Println(result)
希望对你有所帮助
我已经尝试按照此处提到的解决方案 How can I query MongoDB with date range using mgo and 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 的模型是
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)
非常感谢您的帮助。谢谢。
如果您将日期存储为 int64,则可以使用 $lt 等进行整数比较,但首先您必须将日期字段添加为 int64。为此,遍历集合并使用时间通过创建时间然后从中获取秒数将日期从字符串转换为 int64。添加新日期时也将其保存为 int64。整数比较会更快,如果你索引它,索引会比文本索引小。
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()
替代解决方案是将字符串转换为 ISO 日期格式。
collection := client.Database("Hello").Collection("demo")
eventStartTime := "2013-10-01T01:11:18.965Z" //string format
eventEndTime := "2014-12-03T01:11:18.965Z" //string format
const (
layoutISO = "2006-01-02T15:04:05.000Z"
)
//import "time" package.
t1, _ := time.Parse(layoutISO, eventStartTime) //converted to ISODate format
t2, _ := time.Parse(layoutISO, eventEndTime) //converted to ISODate format
//fmt.Println(t1)
filterCursor, err := collection.Find(context.TODO(), bson.M{"sentat": bson.M{"$gt": t1, "$lt": t2}})
if err != nil {
log.Fatal(err)
}
var result []bson.M
if err = filterCursor.All(context.TODO(), &result); err != nil {
log.Fatal(err)
}
fmt.Println(result)
希望对你有所帮助