我试图使用web请求中的查询参数来查询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.如果转换失败,我就按原样使用该值.看到Convert string to integer type in Go?

    filter := bson.D{}
    for key, value := range r.URL.Query() {
      for _, value := range  value {
        intValue, err := strconv.Atoi(value)
        if err != nil {
          filter = append(filter, bson.E{key, value})
        } else {
          filter = append(filter, bson.E{key, intValue})
        } 
      }
    }

Mongodb相关问答推荐

我无法将文档发送到我的MongoDB集合,因为它告诉我使文档无效

$group 和 sum + 添加所有大于

将子文档中的所有字段设置为 false,然后在单个查询中将第二个字段设置为 true

映射数组导致 mongodb 聚合

如何聚合过滤器嵌套文档并从其他字段中获取值

实现 twitter 和 facebook 之类的主题标签

删除一对一和一对多引用 - Mongoose

oplog 在独立 mongod 上启用,不适用于副本集

Mongoose $push 不断添加两个条目

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

Node.js MongoDB Upsert 更新

如何从 node.js 以编程方式执行 mongodump 命令?

如何使用 angular.js 推送通知?

REACT 获取发布请求

在 MongoDB 上使用 $push 更新数组时避免重复值

如何将转储文件夹导入 mongodb 数据库?

如何在 MongoDB 中删除此弃用警告,为什么会这样?

错误:需要数据和盐参数

'this' 在 Mongoose 预保存挂钩中未定义

为什么 Mongo 提示会使查询运行速度提高 10 倍?