angular firestore如何检索多对多关系数据

时间:2018-02-28 04:54:45

标签: javascript firebase google-cloud-firestore angularfire2

我来自RDMS背景。我很难通过关联集合获取关系数据,这是我得到的集合......

databaseReference = firebaseDatabase.getReference("posts");
query = databaseReference.orderByChild("post_kind").equalTo("S");
query.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
          if (dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                   int postId = snapshot.child("post_id").getValue();
                   String postKind = snapshot.child("post_kind").getValue();
                }
            }
        }

      @Override
      public void onCancelled(DatabaseError databaseError) {
          Log.e("DatabaseError", databaseError.toString());
       }
});

我想列出科技组中的用户,基本上我可以像这样查询

users collection
- user_1
  - name: abc
  - email: xxxx@example.com
- user_2
  - name: efg
  - email: efg@example.com

groups collection
- group_tech
  - name: tech
- group_finance
  - name: finance

groupUsers collection
- groupUserID
  - groupID: group_tech
  - userID: user_1

还有另一种方法来解决我以这种方式对数据进行建模的问题。

this.groupUsersCol = this.afs.collection('groupUsers');

this.groupUsersCol.ref.where('groupID', '==', this.params.gid)
  .onSnapshot(function(querySnapshot) {
      var employees = [];
      querySnapshot.forEach(function(doc) {

        // here i only get the user id, how i get the user doc? 
        // Also, i cannot direct call this.afs.doc(...)
        console.log("user", doc.data())
      });
  });

以这种方式存储数据的好处是,检索数据非常方便。像...

如果您想要获取该组中的所有用户,您可以在

中查询
users collection
- user_1
  - name: abc
  - email: xxxx@example.com
  - groups: {
      group_tech: true
    }
- user_2
  - name: efg
  - email: efg@example.com
  - groups: []

groups collection
- group_tech
  - name: tech
  - users: {
      user_1: true
    }
- group_finance
  - name: finance
与用户一样,获得用户的群体,绝对容易。但是从组中删除用户时存在缺点。你需要从2个表中删除。

请建议!分享您的经验和实践方法,这将是一件好事,欢迎并非常感谢您!

1 个答案:

答案 0 :(得分:0)

我建议使用第二种方式,正如您所提到的那样,它可以更好地查询并简化您的安全规则。请注意复合索引有20k的限制,所以如果您的用户在数千个组中,请不要这样做。

为了解决这个缺点,不是处理“删除”客户端,而是使用云功能在服务器端执行。只需使用Cloud Functions监听器监控用户和组,查找已更改的字段,如果现在任何关系false删除关系的两端。