如何从firebase中的所有子位置获取特定对象值

时间:2014-10-16 03:54:50

标签: angularjs firebase

在firebase中

var userRef = http://xx.firebaseio.com/users

我可以让所有用户都喜欢

var userAllRecords = $ firebase(userRef)。$ asObject();

这将给我所有记录,我可以过滤它们并获得欲望值/操作。

但是,当我只对一组记录感兴趣时,如果用户在所有用户之间进行平衡和命名,我怎么能在处理移动设备应用程序时特别避免这些额外操作?

所以我看起来像在asObject()方法中传递对象名称。例如,只从所有用户获取user_balance和user_name

例如:var userAllRecords = $ firebase(userRef)。$ asObject(user_balance,user_name);

我找不到符合此处的任何内容:https://www.firebase.com/docs/web/api/

1 个答案:

答案 0 :(得分:4)

您无法以您希望的方式获取节点集合的子集。 Firebase始终检索/同步完整节点。

要解决此问题,您必须规范化数据结构。您有大约三种选择:

  1. 在每个用户的余额中创建仅包含userids和“加入”的节点(使用once
  2. 将所有用户的余额存储在单独的balances节点
  3. 混合前两种方法并将余额存储在每个用户和全局balances节点下
  4. 所以如果你现在有这个结构:

    users
        userid1
            user_name: "Frank van Puffelen"
            user_balance: 15281
        userid2
            user_name: "star18bit"
            user_balance: 1178
    

    方法1:保留用户标识的索引

    数据结构变为:

    userids
        userid1
        userid2
    users
        userid1
            user_name: "Frank van Puffelen"
            user_balance: 15281
        userid2
            user_name: "star18bit"
            user_balance: 1178
    

    然后代码如下:

    var root = new Firebase(FB_URL);
    new root.child('userids').on('child_added', function(useridsnapshot) {
      var userid = useridsnapshot.name();
      root.child('users/'+userid+'/user_balance').once('value', function(balancesnapshot) {
          // TODO: do something with balancesnapshot.value();
      }
    };
    

    方法2:保持全球余额

    数据结构变为:

    balances
        userid1: 15281
        userid2: 1178
    users
        userid1
            user_name: "Frank van Puffelen"
        userid2
            user_name: "star18bit"
    

    然后代码如下:

    var root = new Firebase(FB_URL);
    new root.child(balances).on('child_added', function(snapshot) {
      var userid = snapshot.name();
      var balance = snapshot.val();
    };
    

    你可以从中找出方法3。