提取用户组的最快方法(数百万行)

时间:2019-03-05 10:37:49

标签: javascript firebase firebase-realtime-database

这是我当前的数据库结构:

- 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即可轻松识别用户所属的组。 / p>

现在group下有user键,我们可以改为执行以下查询来检索属于某个组的用户:

firebase.database().ref('users').orderByChild('group').equalTo('group1').once('child_added');

我的问题是,此查询现在是否会使usersGroups数据冗余,还是为了快速起见,还是应该像上一个示例一样继续检索网上论坛的用户?

1 个答案:

答案 0 :(得分:1)

我认为最好像这样构造数据:

- 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}]
})

由于现在已分配了该组并从数据库本身对其进行了过滤,因此过滤数据更容易,代码更少,并且无需对组中所有用户进行数组然后获取其数据。