Go语言下使用Kamva mgm按UserID过滤App集合时查询返回空如何解决?
基于Kamva mgm实现按用户ID过滤查询App集合的正确实现
查询返回空的核心原因
出现添加过滤条件后查询结果为空的情况,通常是两类不匹配问题导致的:
- 过滤条件的键与Mongo实际存储的字段名不匹配
定义的App结构体中,UserId字段已显式声明BSON映射标签为bson:"userId",说明Mongo集合中存储的字段名就是小写开头的userId。如果查询时直接拿Go结构体的大写字段名UserId当过滤键,会因为键名大小写和实际存储字段不一致,无法命中数据。 - 过滤值的类型与字段定义的类型不匹配
App结构中的UserId字段定义为primitive.ObjectID类型,如果传入的过滤值是普通字符串形式的ID,会因为BSON类型不匹配(ObjectID和字符串是两种独立的存储类型),即使ID的十六进制内容完全一致,也无法查询到匹配数据。
正确的查询代码实现
按照字段映射和类型要求调整后的可运行代码如下:
apps := []Models.App{} collection := mgm.Coll(&Models.App{}) // 先将十六进制格式的用户ID字符串转换为primitive.ObjectID类型,注意处理格式转换错误 targetUserID, err := primitive.ObjectIDFromHex("需要查询的目标用户ID十六进制字符串") if err != nil { // 自行添加ID格式非法的错误处理逻辑 return err } // 过滤条件的键严格匹配App结构上定义的bson标签值,值使用转换后的ObjectID类型 err = collection.SimpleFind(&apps, bson.M{ "userId": targetUserID, })
常见踩坑提醒
- 不要直接使用Go结构体的大写字段名作为查询键,所有查询键必须和结构体字段上通过
bson:"xxx"指定的映射名完全一致,包括大小写。 - 传入的过滤值必须和结构体中对应字段的Go类型完全匹配:对于ObjectID类型的字段,必须传入
primitive.ObjectID类型的值,不能传入等价的字符串。 - 如果字段没有显式声明bson标签,Mongo官方驱动会默认将结构体字段名转换为全小写形式作为存储字段名,此时查询键也需要使用对应的全小写名称才能匹配。
内容的提问来源于stack exchange,提问作者Sienael
相关产品推荐
相关产品推荐

