Go语言中使用bolthold构建BoltDB查询:如何处理tenantID为nil的场景
解决BoltDB BoltHold查询中tenantID为nil/未设置的场景问题
嘿,我来帮你搞定这个查询的问题!你的现有语句已经能正确匹配roles包含指定角色且tenantID等于目标值的条目,但确实漏掉了tenantID未设置(也就是字段不存在或为nil)的情况。
修改思路
我们需要把tenantID的条件从单一的“等于指定值”,改成**“等于指定值 或者 字段不存在/为nil”**的组合逻辑。BoltHold支持用Or操作符来组合这两个条件,再把这个组合条件放到原来的And里,和角色条件一起生效。
修改后的查询语句
根据你的数据存储方式,有两种常见的写法:
场景1:tenantID未设置时,该字段在BoltDB中完全不存在
这种情况用NotExists()来判断字段不存在:
query := bolthold.Where(roleskey).ContainsAny(bolthold.Slice(roles)...).And( bolthold.Where(tenantIDKey).Eq(tenantID).Or(tenantIDKey).NotExists(), )
场景2:tenantID是指针类型(比如*string),未设置时字段值为nil
这种情况可以直接用Eq(nil)来匹配nil值:
query := bolthold.Where(roleskey).ContainsAny(bolthold.Slice(roles)...).And( bolthold.Where(tenantIDKey).Eq(tenantID).Or(tenantIDKey).Eq(nil), )
逻辑说明
修改后的语句会筛选出同时满足以下两个条件的条目:
- 条目包含指定的任意一个角色(和原来的逻辑一致)
- 条目要么
tenantID等于指定值,要么tenantID未设置(不存在或为nil)
这样就完美覆盖了你需求里的所有场景啦!
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

