Firebase实时数据库:获取除当前用户外的所有用户列表
Firebase实时数据库排除当前用户的查询方案
Firebase实时数据库不支持直接的「不等于」查询条件,要在数据库层面实现排除当前用户的需求,可以通过两次范围查询合并结果的方式实现,具体思路如下:
实现原理
Firebase的字符串类型数据默认按字典序排序,用户UID属于字符串,因此可以拆分查询范围:
- 查询所有UID小于当前用户UID的用户
- 查询所有UID大于当前用户UID的用户
- 合并两次查询的结果,得到除当前用户外的所有用户
代码实现
const getUserList = () => { const currentUid = currentuser.uid; const usersRef = ref(database, 'users/'); // 筛选UID小于当前用户的用户 const lowerUsersQuery = query(usersRef, endBefore(currentUid)); // 筛选UID大于当前用户的用户 const upperUsersQuery = query(usersRef, startAfter(currentUid)); // 监听第一个查询结果 onValue(lowerUsersQuery, (lowerSnapshot) => { const lowerUserData = lowerSnapshot.val() || {}; const lowerUsers = Object.values(lowerUserData); // 监听第二个查询结果并合并数据 onValue(upperUsersQuery, (upperSnapshot) => { const upperUserData = upperSnapshot.val() || {}; const upperUsers = Object.values(upperUserData); const filteredUsers = [...lowerUsers, ...upperUsers]; setUsers(filteredUsers); }); }); };
注意事项
- 该方案直接在数据库层面完成筛选,无需拉取全量用户数据后再用JS过滤,能有效节省带宽
- Firebase对字符串的排序是字典序,用户UID的生成规则完全符合这种排序逻辑,因此范围查询有效
- 若当前用户UID是字典序的第一个或最后一个,其中一次查询会返回空数组,合并后结果依然正确
- 使用
onValue监听可实现数据实时更新,若只需单次查询,可替换为get方法
内容的提问来源于stack exchange,提问作者Alishbah riaz
相关产品推荐
相关产品推荐

