2013-07-11 2 views
1

У меня есть защищенная коллекция firebase для пользователей моего сайта, всего лишь массив пользовательских объектов. Правила разрешений для пользователей позволяют аутентифицированному пользователю получать доступ только к их пользовательскому объекту в списке пользователей и никому другому.Как получить количество детей в защищенной коллекции Firebase?

Я пытаюсь установить простой способ получить счет всех пользователей в коллекции с помощью этой схемы разрешений, чтобы я мог отображать общий подсчет пользователей на моем сайте, однако, похоже, не существует способа чтобы получить счет всех пользователей без получения разрешения.

Любые идеи о том, как исправить это?

Я полагаю, что я мог бы хранить счет в общедоступном месте базы данных, который увеличивается и уменьшается каждый раз, когда пользователь добавляется/удаляется, но я бы предпочел не хранить данные дважды и беспокоиться о несоответствиях.

Я полагаю, что у меня также мог быть аутентифицированный наблюдатель на моем сервере, который обходит требования разрешения и отправляет клиенту (либо через firebase путем записи в общедоступное местоположение, либо через api) счет пользователя.

В идеале, я хотел бы иметь все клиентскую сторону в данный момент, поэтому, пожалуйста, дайте мне знать, если на это простое решение.

Спасибо!

ответ

1

Дублирование данных в значительной степени является нормой в NoSQL, поэтому хранение счетчика вполне разумно. Посмотрите статью Firebase на denormalization

Это довольно много подводит подходы, как я их понимаю.

Использование счетчика

Это быстро, и это довольно просто, если предположить, что вы используете хорошие СУХИХ принципы и централизовать все ваши манипуляции записей. Используйте транзакцию, чтобы обновлять счетчик каждый раз, когда запись добавляется или удаляется:

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 для клиентов, легко обрабатывает сотни тысяч профилей, если у них небольшой размер. Требуется, чтобы вы что-то поддерживали. Heroku и Nodejitsu будут размещать это бесплатно, пока у вас не появятся пользователи из ваших ушей.

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()); 
    }); 
} 
Смежные вопросы