Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从扁平结构中检索数据_Javascript_Firebase - Fatal编程技术网

Javascript 如何从扁平结构中检索数据

Javascript 如何从扁平结构中检索数据,javascript,firebase,Javascript,Firebase,以下是我的数据: { "users": { "someRandomUserId": { "name": "Name 1", "accounts": { "someRandomAccountId": true } }, "someRandomUserId2": { "name": "Name 2",

以下是我的数据:

{
    "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/someRandomUserId2/accounts
处读取值,并在此基础上读取
accounts/someRandomAccountId
accounts/someRandomAccountId2
处的值。如果您正在寻找让Firebase自动执行此“交叉引用”的方法;现在还没有。是的,我想避免的是在所有账户中循环。这是唯一的方法吗?@Marein我在最初的尝试中编辑了这个问题。不是所有的帐户,你只需要检索相关的帐户。但是的,据我所知,这是目前唯一的方法。实际上可能还有一种方法,让我试着写下来作为答案。是的,这是如何返回帐户数据的?只是身份证,对吗?我真的很感激你的回答!如果是,则必须再次从数据库中检索这些。我敢肯定,无论哪种方式,你都需要做一个检索循环。我会接受答案,因为这似乎是当前的方法。我已经研究了Firebase.util,它可以很容易地实现我需要的功能,只是不确定以后它将如何处理安全性。再次感谢。没问题,我希望Firebase将实现一些功能,使这些事情变得更容易。