Firebase如何查询仅含user角色、不含admin角色的普通用户?
错误原因
你使用的where("roles", "!=", "admin")查询无法满足需求,是因为Firestore对数组字段使用!=运算符的匹配规则为:只要数组中存在至少一个元素不等于指定值,就会返回该文档。管理员的roles数组中包含user值,自然符合匹配条件,所以会被包含在结果里。
正确写法
方案1:使用array-contains-none操作符(推荐)
Firestore提供了专门的数组查询操作符array-contains-none,用于筛选数组中不包含指定列表内任意元素的文档,直接写即可:
.collection("users") .where("roles", "array-contains-none", ["admin"])
如果需要额外确保返回的用户都持有普通用户身份,可以叠加array-contains条件筛选:
.collection("users") .where("roles", "array-contains", "user") .where("roles", "array-contains-none", ["admin"])
注意:使用多条件查询需要提前创建对应复合索引,首次调用查询报错时,Firebase会在报错日志中给出一键创建索引的链接,点击跳转创建即可使用。
方案2:冗余字段优化(性能更优)
如果你的查询场景非常高频,可以在用户文档中新增一个布尔类型的isAdmin字段,每次更新roles数组时同步更新该字段的值,查询直接走单字段匹配即可:
.collection("users") .where("isAdmin", "==", false)
这种方式不需要处理数组查询逻辑,查询性能更高,也不需要额外创建复合索引。
内容的提问来源于stack exchange,提问作者JS3
相关产品推荐
相关产品推荐

