假设我有以下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”需要相同。在上面的例子中,如果我更新user1 full_name,我如何在不同的组内更新它?
UPDATE
根据弗兰克的回答:
在您的代码中,一个简单的多位置更新将写入这些位置:
"/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)
})
})
}
两者都有效,但是通过将一个对象推入一个数组,每当我对一个游览进行更新时,它会在数组中添加一个新对象而不是更新原始对象,这是有道理的,但这是我想要做的?
我是否必须先获取一个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"
如果您只需要在一个地方更新名称,那么这确实更有用。但作为回报,阅读一个团体的成员现在要简单得多。
是否更好地复制这样的数据,或者执行客户端连接取决于您的应用程序的要求以及重复数据的舒适程度。