javascript - 拉取用户组的最快方式(数百万行)
问题描述
这是我当前的数据库结构:
- usersGroups
- group1
- user1: true
- user2: true
- user3: true
- users
- user1
- name: 'Bob'
- group: group1
- user2
- name: 'Carl'
- group: group2
- user3
- name: 'Peter'
- group: group3
为了确定属于 的用户的名称group1
,我目前执行此请求:
const groupUserSnap = firebase.database().ref('usersGroups/group1').once('value');
let userPromises = [];
groupUserSnap.forEach((snap) => {
userPromises.push(
firebase.database().ref(`users/${snap.key}`).once('value')
);
});
// Wait until we have resolved promises for each user key
const userSnaps = await Promise.all(userPromises);
userSnaps.forEach((userSnap) => {
const user = userSnap.val();
console.log(`User's name is ${user.name}`);
});
此查询获取属于相关组的用户的所有键,然后遍历每个键以提取完整的用户值。
最近,我们还group
为每个用户添加了密钥(如上图所示),这样我们就可以轻松识别用户所属的组,而无需查询userGroups
。
现在group
键存在于 下user
,我们可以执行此查询来检索属于某个组的用户:
firebase.database().ref('users').orderByChild('group').equalTo('group1').once('child_added');
我的问题是,这个查询现在是否会使usersGroups
数据变得多余,或者我是否应该像在前面的示例中那样继续检索组的用户,以提高速度?
解决方案
我相信像这样构造数据会更好:
- users
- user1
- name: 'Bob'
- group: 1
- user2
- name: 'Carl'
- group: 2
- user3
- name: 'Peter'
- group: 3
不要忘记将您的 Firebase 数据库规则更新为以下内容:
"users": {
".indexOn": ["group"]
}
然后您将能够像这样过滤/排序数据:
let groupNum = 1 // the group's number being filtered
firebase.database().ref('users')
.orderByChild('group')
.equalTo(groupNum)
.once('value', (snapshot) => {
let filteredUsers = []
snapshot.forEach((user) => {
filteredUsers.push({
_key: user.key,
...user.val() //this will add all the user's value
})
})
console.log(filteredUsers) // will show [{_key: 'user1', name: 'Bob', group: 1}]
})
更容易过滤数据,更少的代码,并且不需要将组中的所有用户组成一个数组,然后获取他们的数据,因为组现在已分配并从数据库本身过滤。