多个位置的Firebase更新

时间:2017-12-14 05:52:44

标签: firebase firebase-realtime-database

假设我有以下firebase结构

{
  "users":{
    "user1":{
        "username":"john",
        "full_name":"John Vincent",
        "created_at":"9th Feb 2015",
        "groups":{
            "group1":true,
            "group3":true
        }
        "last_logins":...
    },
    "user2": ...,
    "user3": ...
  }
  "groups": {
     "group1"{
        "group_name":"Administrators",
        "group_description":"Users who can do anything!",
        "no_of_users":2,
        "members":{
            "user1":true,
            "user3":true
        }
      },
     "group2"{
        "group_name":"Moderators",
        "group_description":"Users who can only moderate!",
        "no_of_users":1,
        "members":{
            "user2":true
        }
      }
   }
 }

现在,如果我想获得第1组中的用户列表,那将很容易,但如何使用其用户名,full_name等获取第1组中的用户列表?我是否必须先获取一个id列表,然后执行foreach以获取每个用户信息,然后将它们添加到数组中?我认为必须有更好的方法。

例如:如果我点击一个组,我想先显示一个显示其full_name的用户列表,所以我修改了上面的结构:

{
  "users":{
    "user1":{
        "username":"john",
        "full_name":"John Vincent",
        "created_at":"9th Feb 2015",
        "groups":{
            "group1":true,
            "group3":true
        }
        "last_logins":...
    },
    "user2": ...,
    "user3": ...
  }
  "groups": {
     "group1"{
        "group_name":"Administrators",
        "group_description":"Users who can do anything!",
        "no_of_users":2,
        "members":{
            "user1": {
               "full_name":"John Vincent"
            }
            "user3": {
               "full_name":"John Doe"
            }
        }
      },
     "group2"{
        "group_name":"Moderators",
        "group_description":"Users who can only moderate!",
        "no_of_users":1,
        "members":{
            "user1": {
               "full_name":"John Vincent"
            }
        }
      }
   }
 }

现在full_name在user1的3个不同位置重复,可能更多取决于他所在的群组数量,我如何进行firebase多位置更新?我已经在线阅读了有关多地点更新的信息,似乎结尾了#id; id"对于多位置更新需要相同。在上面的例子中,如果我更新user1 full_name,我如何在不同的组内更新它???

更新

根据弗兰克的回答:

  

在您的代码中,一个简单的多位置更新会写出这些   位置:

"/users/user1/full_name": "New Name",
"/groups/group1/members/user1/full_name": "New Name"
"/groups/group2/members/user1/full_name": "New Name"

上面的代码假设用户在group1和group2中,但他也可能在其他组中,你怎么想得到一个组列表,因为你不知道他在哪个组而不检查每个组,所以它最后再次在foreach循环中检查用户组?再次感谢弗兰克,是的,我假设做一个foreach循环将是一个非常耗时的过程,我想这与firebase的情况并非如此。我会试验一下。

更新2

所以我使用angularfire2测试这个,这是我的原始代码:

tours: any[];

this.firebase.get_user_tours().snapshotChanges()
.takeUntil(this.ngUnsubscribe).subscribe(tours => {
  this.tours = tours
}

现在我正在使用它,因为我正在改变我的数据库结构。

tours = [];

this.firebase.get_user_tours().snapshotChanges()
.takeUntil(this.ngUnsubscribe).subscribe(tours => {
  tours.forEach(tour => {
    this.firebase.get_tour(tour.key).snapshotChanges()
    .takeUntil(this.ngUnsubscribe).subscribe(tour => {
      this.tours.push(tour)
    })
  })
}

两者都有效,但是通过将对象推入数组,每次我对游览进行更新时,它会在数组中添加一个新对象而不是更新原始对象,这是有道理的,但这就是我所做的事情。我想这样做?

1 个答案:

答案 0 :(得分:0)

  

我必须首先获取一个id列表,然后执行foreach以获取每个用户信息,然后将它们添加到数组中吗?

是的,这种客户端加入与Firebase一样正常。它也没有大多数开发人员想象的那么慢,因为Firebase pipelines the requests

  

如果我更新user1 full_name,我如何在不同的组内更新它?

在此数据结构中,您已在多个位置复制了全名。我介绍了最常用的方法,可以在此处更新重复数据:How to write denormalized data in Firebase

在您的代码中,一个简单的多位置更新会写下这些位置:

"/users/user1/full_name": "New Name",
"/groups/group1/members/user1/full_name": "New Name"
"/groups/group2/members/user1/full_name": "New Name"

如果您只需要在一个地方更新名称,那么这确实是更多的工作。但作为回报,阅读一个小组成员现在要简单得多。

复制此类数据或执行客户端连接是否更好取决于您的应用程序的要求以及重复数据的舒适度。