Go使用MongoDB Driver查询Profile时返回字段不完整如何解决
问题原因
你遇到的字段返回空/零值的问题是结构体字段和MongoDB存储的字段名映射不匹配导致的:
Go官方MongoDB驱动在解码BSON数据时,如果结构体字段没有显式声明bson标签,会默认将大驼峰格式的字段名转换为小驼峰格式作为匹配的目标字段名,而你数据库中实际存储的字段名是全小写格式(比如计数字段为followercount而非followerCount),因此除了刚好匹配的username字段外,其他字段都无法正确解码,只能返回对应类型的零值。
修复方案
给Profile结构体的所有字段加上和数据库实际字段名完全对应的bson标签即可,修改后的结构体参考:
type Profile struct { Username string `bson:"username"` Verified bool `bson:"verified"` Protected bool `bson:"protected"` Avatar string `bson:"avatar"` Banner string `bson:"banner"` FollowerCount int32 `bson:"followercount"` FollowingCount int32 `bson:"followingcount"` TreatCount int32 `bson:"treatcount"` LikeCount int32 `bson:"likecount"` Name string `bson:"name"` Bio string `bson:"bio"` Website string `bson:"website"` Location string `bson:"location"` }
可选排查项
如果修改后仍有问题,可以按以下顺序排查:
- 确认
SearchProfiles方法查询的集合和getProfile用的是同一个集合,没有查错库或集合 - 可以在查询时显式指定返回字段,避免驱动默认过滤字段:
// 导入"go.mongodb.org/mongo-driver/mongo/options" findOpts := options.Find().SetProjection(bson.D{ {Key: "username", Value: 1}, {Key: "bio", Value: 1}, // 其余需要返回的字段都按上述格式添加,1表示返回 }) cur, err := userColl.Find(ctx, filterr, findOpts)
内容的提问来源于stack exchange,提问作者user16838682
相关产品推荐
相关产品推荐

