如何获取受保护Firebase集合中的儿童数量?

如何获取受保护Firebase集合中的儿童数量?,firebase,firebase-security,Firebase,Firebase Security,我为我网站的用户提供了一个受保护的firebase集合,只是一个用户对象数组。用户权限规则允许经过身份验证的用户仅访问用户列表中的用户对象,而不访问其他任何人 我正在尝试设置一种简单的方法来获取具有此权限方案的集合中所有用户的计数,这样我就可以在我的网站上显示总用户数,但是似乎没有一种方法可以在不存在权限问题的情况下获取所有用户的计数 有没有办法解决这个问题 我想我可以在公开可读的firebase位置存储一个计数,每当添加/删除用户时,该计数就会递增或递减,但我宁愿不存储两次数据,也不担心不匹配

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

我正在尝试设置一种简单的方法来获取具有此权限方案的集合中所有用户的计数,这样我就可以在我的网站上显示总用户数,但是似乎没有一种方法可以在不存在权限问题的情况下获取所有用户的计数

有没有办法解决这个问题

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

我想我的服务器上也可以有一个经过身份验证的观察者,它绕过权限要求,向客户端发送用户计数(通过firebase写入公共位置或作为api公开)

理想情况下,我希望现在一切都在客户端,所以请告诉我是否有一个简单的基于权限的解决方案


谢谢

数据复制几乎是NoSQL中的常态,因此存储计数器是完全合理的。查看上的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"
   }
}
利用服务器进程

轻松无痛;uber fast适用于客户,只要占用空间小,就可以轻松处理数十万条个人资料。需要你维护一些东西。并将免费主持这个,直到你有用户从你的耳朵出来

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() );
   });
}

数据复制在NoSQL中几乎是常态,因此存储计数器是完全合理的。查看上的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"
   }
}
利用服务器进程

轻松无痛;uber fast适用于客户,只要占用空间小,就可以轻松处理数十万条个人资料。需要你维护一些东西。并将免费主持这个,直到你有用户从你的耳朵出来

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() );
   });
}