如何从平面结构中检索数据

时间:2015-05-01 14:38:09

标签: javascript firebase

这是我的数据:

{
    "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
            }
        }
    }
}

阅读完文档后,我相信这就是我应该如何设置的。如果我在这里完全处于左侧,请告诉我。我的实际问题是,我有'someRandomUserId2'的用户ID,如何获得用户与其数据相关联的帐户列表?我想以某种方式得到这些数据:

"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];
});

1 个答案:

答案 0 :(得分:4)

您可以在数据库中添加一个额外的结构,专门列出哪些用户属于哪个帐户,如下所示:

"accountusers": {
    "someRandomAccountId": {
        "someRandomUserId": true,
        "someRandomUserId2": true
    },
    "someRandomAccountId2": {
        "someRandomUserId2": true
    }
}

然后,您可以使用以下查询来获取属于someRandomUserId2的所有帐户:

ref.child("accountusers").orderByChild("someRandomUserId2").equalTo(true)

此方法要求用户可以读取整个accountusers

orderByChildequalTo只能深入一级。否则,可以为现有数据结构编写类似的查询。