使用查询参数过滤 MongoDB Go 驱动程序时出现问题

问题描述 投票:0回答:1

我正在尝试使用网络请求中的查询参数来查询 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

每个之间有什么区别。两个值似乎都是字符串,但其中一个有效,另一个无效。

mongodb go http
1个回答
0
投票

正如 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})
      }
© www.soinside.com 2019 - 2024. All rights reserved.