使用Firebase-util解决一对多关系

时间:2014-08-26 17:44:52

标签: firebase

我一直在https://firebase.github.io/firebase-util/查看firebase util项目。我无法弄清楚这是否可能。

假设我有这样的数据集:

{ clients:
   { client1: { groups: { group1: true, group2: true }, name: 'client1' },
     client2: { groups: { group3: true, group4: true }, name: 'client2' } },
  groups:
   { group1: { name: 'group1' },
     group2: { name: 'group2' },
     group3: { name: 'group3' },
     group4: { name: 'group4' },
     group5: { name: 'group5' } } }

我想检索“client1”并解析与client1关联的所有组,让我返回一个这样的数据集。

{ client1: { groups: { group1: { name: 'group1' }, group2: { name: 'group2' } }, name: 'client1' }

有没有办法用Firebase-util做到这一点?

网站上有一个类似的例子,它将帐户加入个人资料,然后将样式映射到另一个参考点。

var ref = Firebase.util.join(
    new Firebase('INSTANCE/account'),
    {
       ref: new Firebase('INSTANCE/profile'),
       keyMap: {
          name: 'name',
          nick: 'nick',
          style: new Firebase('INSTANCE/styles')
       }
    }
);

但是,我没有看到如何用我正在寻找的东西来做。

类似的东西:

FirebaseUtil.join(
  { ref: new Firebase('INSTANCE/clients/client1'), keyMap: {name: 'name', groups: new Firebase('INSTANCE/groups')} }
)

感谢任何提示!

1 个答案:

答案 0 :(得分:2)

您不能使用嵌套的组列表作为clients/$client/groups的键盘映射。它必须是指向一个引用的字符串。

解决方案是从用户的元数据中单独检索列表:

var fb = new Firebase(URL);

getClients(fb.child('clients'), function(userId, data) {
   console.log(userId, data);
});

function getGroupsForClient(clientId, callback) {
   var indexRef = fb.child('clients/'+clientId+'/groups');
   var groupsRef = fb.child('groups');
   var intersectionRef = new Firebase.util.intersection(indexRef, groupsRef);
   intersectionRef.once('value', callback);
}

function getClients(callback) {
   fb.child('clients').on('child_added', function(snap) {
      var userId = snap.name();
      var userData = snap.val();
      getGroupsForClient(userId, function(snap) {
         userData.groups = snap.val();
         callback(userId, userData);
      });
   });
}