我正在尝试使用网络请求中的查询参数来查询 mongodb。我已成功解析该值并将其添加到
bson.d
但它返回 null
。
router.HandleFunc("/route", func(w http.ResponseWriter, r *http.Request) {
coll := s.MongoDB.Database("the-database").Collection("collection")
filter := bson.D{}
for key, value := range r.URL.Query() {
for _, value := range value {
filter = append(filter, bson.E{key, value})
fmt.Println("filter: ", reflect.TypeOf(value))
}
}
cursor, err := coll.Find(context.TODO(), filter1)
if err != nil {
w.Write([]byte("Unable find any items."))
}
var items []Property
if err = cursor.All(context.TODO(), &items); err != nil {
w.Write([]byte("Unable find any items."))
}
jsonData, err := json.MarshalIndent(items, "", " ")
if err != nil {
panic(err)
}
w.Write([]byte(jsonData))
})
但是,手动将
bson.E
添加到 bson.D
会成功返回值。示例:
filter1 := bson.D{}
filter1 = append(filter1, bson.E{"key", 1234})
使用
reflect.DeepEqual(filter, filter1)
比较两个值会返回 false
,即使打印值看起来相同。
// curl "http://localhost:8080/api/v1/route?key=1234"
filter: [{key 1234}]
TypeOf: primitive.E // reflect.TypeOf(filter[0])
//filter1 := bson.D{}; filter1 = append(filter1, bson.E{"key", 1234})
filter1: [{key 1234}]
TypeOf: primitive.E // reflect.TypeOf(filter1[0])
fmt.Print(reflect.DeepEqual(filter, filter1)) // False
每个之间有什么区别。两个值似乎都是字符串,但其中一个有效,另一个无效。
正如 icza 所提到的,查询参数发送的值不是整数。事实上,查询参数总是作为字符串发送,解析需要在服务器端处理。我最终使用
strconv.Atoi()
将字符串值转换为 int。如果转换失败,我将按原样使用该值。请参阅在 Go 中将字符串转换为整数类型?
filter := bson.D{}
for key, value := range r.URL.Query() {
for _, value := range value {
value, err := strconv.Atoi(value)
if err != nil {
}
filter = append(filter, bson.E{key, value})
}