2013-07-11 21 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()); 
    }); 
}