2013-07-11 16 views
1

我为我的网站用户提供了一个受保护的firebase集合,只是一组用户对象。用户的权限规则允许经过身份验证的用户只能访问用户列表中的用户对象,而不能访问其他用户。如何获取受保护的Firebase集合中的儿童人数?

我试图设置一个简单的方法来获取具有此权限方案的集合中所有用户的计数,以便我可以在我的网站上显示总用户数,但似乎没有办法在没有获得许可问题的情况下统计所有用户。

有关如何解决此问题的任何想法?

我想我可以在一个公开可读的firebase位置存储一个计数,每当用户被添加/删除时都会增加或减少计数,但我宁愿不储存数据两次并担心不匹配。

我想我的服务器上也可以有一个经过身份验证的监视器,它可以绕过权限要求并发送给客户端(通过写入公共位置或通过暴露为api的Firebase)用户数。

理想情况下,我希望目前拥有所有客户端,所以请让我知道是否有一个简单的基于权限的解决方案。

谢谢!

回答

1

数据重复在NoSQL中非常普遍,所以存储计数器是非常合理的。查看有关denormalization

的Firebase文章。这几乎总结了我了解它们的方法。

使用计数器

它速度快,它是相当简单的,假设你使用好的DRY原则和集中的记录你的所有操作。利用每个交易记录被添加或删除的时间来更新计数器:在

function addUser(user) { 
    // do your add stuff... 
    updateCounter(1); 
} 

function removeUser(user) { 
    // do your remove stuff... 
    updateCounter(-1); 
} 

function updateCounter(amt) { 
    userCounter.transaction(function(currentValue) { 
     currentValue || (currentValue === 0); // can be null 
     return currentValue + amt; 
    }); 
} 

独立的公共和安全的数据

存储敏感数据(电子邮件地址,事见不得人)私人路径,保持其公共用户数据可读。

这可以防止需要同步计数器。但是,它确实意味着客户必须下载整个公共用户列表来创建计数。因此,保持公开个人资料很小(一个名字,一个时间戳,没有其他),所以它可以在不花几秒时间的情况下运作到数万人。

"users": { 
    ".read": true, 
    "$user": { 
     // don't try to put a ".read" here; it won't remove access 
     // after the parent path allows it 
    } 
} 

"users_secured": { 
    "$user": { 
     ".read": "auth.id === $user" 
    } 
} 

利用一个服务器进程

容易和无痛;超快速的客户端,只要占用空间小,就可轻松处理数十万个配置文件。需要你维护一些东西。 HerokuNodejitsu将免费举办此活动,直到您有用户脱离您的耳朵。

var Firebase = require('firebase'); 

var fb = new Firebase(process.env.FBURL); 
fb.auth(process.env.SECRET, function() { 
    fb.child('users').on('value', function(snap) { 
     fb.child('user_counter').set(snap.numChildren()); 
    }); 
}