我试图使用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
每个人之间有什么区别.这两个值看起来都是字符串,但其中一个有效,另一个无效.