如何从扁平结构中检索数据
How to retrive data from flattened structure
这是我的数据:
{
"users": {
"someRandomUserId": {
"name": "Name 1",
"accounts": {
"someRandomAccountId": true
}
},
"someRandomUserId2": {
"name": "Name 2",
"accounts": {
"someRandomAccountId": true,
"someRandomAccountId2": true
}
}
},
"accounts": {
"someRandomAccountId": {
"name": "Account1",
"users": {
"someRandomUserId": true,
"someRandomUserId2": true
}
},
"someRandomAccountId2": {
"name": "Account2",
"users": {
"someRandomUserId2": true
}
}
}
}
阅读文档后,我相信这就是我应该设置的方式。如果我在这里完全处于左场,请告诉我。我的实际问题是我的用户 ID 为 'someRandomUserId2' 如何获取与用户关联的帐户列表及其数据?我想以某种方式取回这些数据:
"accounts": {
"someRandomAccountId": {
"name": "Account1"
},
"someRandomAccountId2": {
"name": "Account2"
}
}
或者至少是类似的东西。我试过使用 startAt 和 endAt,但我不知道如何让它们在对象上工作:
accountRef
.orderByChild('users.' + userId)
.equalTo(true)
更新
这是我目前的方法,看起来有点矫枉过正:
var userRef = myDataRef.child('users');
var accountRef = myDataRef.child('accounts');
var accounts = {};
var userAccounts = userRef.child(userId + '/accounts');
userAccounts.on('child_added', function(dataSnap){
var accountId = dataSnap.key();
var accountData = accountRef.orderByKey().equalTo(accountId);
accountData.on('child_added', function(dataSnap){
accounts[accountId] = dataSnap.val();
});
accountData.on('child_removed', function(){
delete accounts[accountId];
});
});
userAccounts.on('child_removed', function(dataSnap){
var accountId = dataSnap.key();
delete accounts[accountId];
});
您可以向数据库添加一个额外的结构,专门列出哪些用户属于哪些帐户,如下所示:
"accountusers": {
"someRandomAccountId": {
"someRandomUserId": true,
"someRandomUserId2": true
},
"someRandomAccountId2": {
"someRandomUserId2": true
}
}
然后您可以使用以下查询获取属于 someRandomUserId2
的所有帐户:
ref.child("accountusers").orderByChild("someRandomUserId2").equalTo(true)
此方法要求用户可以阅读整个 accountusers
。
orderByChild
和 equalTo
只能工作一层深度。否则,可以为您现有的数据结构编写类似的查询。
这是我的数据:
{
"users": {
"someRandomUserId": {
"name": "Name 1",
"accounts": {
"someRandomAccountId": true
}
},
"someRandomUserId2": {
"name": "Name 2",
"accounts": {
"someRandomAccountId": true,
"someRandomAccountId2": true
}
}
},
"accounts": {
"someRandomAccountId": {
"name": "Account1",
"users": {
"someRandomUserId": true,
"someRandomUserId2": true
}
},
"someRandomAccountId2": {
"name": "Account2",
"users": {
"someRandomUserId2": true
}
}
}
}
阅读文档后,我相信这就是我应该设置的方式。如果我在这里完全处于左场,请告诉我。我的实际问题是我的用户 ID 为 'someRandomUserId2' 如何获取与用户关联的帐户列表及其数据?我想以某种方式取回这些数据:
"accounts": {
"someRandomAccountId": {
"name": "Account1"
},
"someRandomAccountId2": {
"name": "Account2"
}
}
或者至少是类似的东西。我试过使用 startAt 和 endAt,但我不知道如何让它们在对象上工作:
accountRef
.orderByChild('users.' + userId)
.equalTo(true)
更新
这是我目前的方法,看起来有点矫枉过正:
var userRef = myDataRef.child('users');
var accountRef = myDataRef.child('accounts');
var accounts = {};
var userAccounts = userRef.child(userId + '/accounts');
userAccounts.on('child_added', function(dataSnap){
var accountId = dataSnap.key();
var accountData = accountRef.orderByKey().equalTo(accountId);
accountData.on('child_added', function(dataSnap){
accounts[accountId] = dataSnap.val();
});
accountData.on('child_removed', function(){
delete accounts[accountId];
});
});
userAccounts.on('child_removed', function(dataSnap){
var accountId = dataSnap.key();
delete accounts[accountId];
});
您可以向数据库添加一个额外的结构,专门列出哪些用户属于哪些帐户,如下所示:
"accountusers": {
"someRandomAccountId": {
"someRandomUserId": true,
"someRandomUserId2": true
},
"someRandomAccountId2": {
"someRandomUserId2": true
}
}
然后您可以使用以下查询获取属于 someRandomUserId2
的所有帐户:
ref.child("accountusers").orderByChild("someRandomUserId2").equalTo(true)
此方法要求用户可以阅读整个 accountusers
。
orderByChild
和 equalTo
只能工作一层深度。否则,可以为您现有的数据结构编写类似的查询。