write studio relacionales practices leer datos borrar best bases firebase firebase-database angularfire nosql

studio - Cómo unirte a datos desnormalizados que tienen dos niveles de profundidad en Firebase



leer datos de firebase javascript (1)

Aquí está el escenario: tengo una lista de temas; cada tema incluye publicaciones; y cada publicación fue "gustada" por una lista de usuarios. Por lo tanto, mi información se ve así:

"topics": { "topic1": { "posts": { "post1": true, "post2": true } } }, "posts": { "post1": { "title": "An awesome post", "likes": { "user1": true } }, "post2": { "title": "An even better post", "likes": { "user1": true, "user2": true } } }, "users": { "user1": { "name": "Mr. T", "email": "[email protected]" }, "user2": { "name": "Mr. Hello World", "email": "[email protected]" } }

Yo (creo que) sé cómo obtener todas las publicaciones para el tema usando Firebase.util ( http://firebase.github.io/firebase-util ):

Firebase.util.intersection( fb.child(''topics'').child(''topic1'').child(''posts''), fb.child(''posts'') )

Pero ahora me gustaría que cada publicación incluya los nombres de los usuarios a los que les gustó la publicación. ¿Cómo hace uno eso?

Probablemente no cambiará nada, pero todo esto está sucediendo en AngularFire.


Ver ejemplo de trabajo aquí

La esencia de este tipo de desnormalización es atrapar a los usuarios a medida que captas las publicaciones. No es nada más complejo de lo que parece. Solo ve a atraparlos.

Firebase hace mucho trabajo internamente para optimizar las solicitudes y reutiliza la misma conexión de socket para todos los oyentes, por lo que es bastante eficiente: apenas más sobrecarga que la cantidad de bytes que se descargan, independientemente de si están divididos en rutas separadas o almacenados juntos.

El HTML:

<h3>Normalizing user profiles into posts</h3> <ul ng-controller="ctrl"> <li ng-repeat="post in posts | orderByPriority" ng-init="user = users.$load(post.user)"> {{user.name}}: {{post.title}} </li> </ul>

El JavaScript:

var app = angular.module(''app'', [''firebase'']); var fb = new Firebase(URL); app.controller(''ctrl'', function ($scope, $firebase, userCache) { $scope.posts = $firebase(fb.child(''posts'')); $scope.users = userCache(fb.child(''users'')); }); app.factory(''userCache'', function ($firebase) { return function (ref) { var cachedUsers = {}; cachedUsers.$load = function (id) { if( !cachedUsers.hasOwnProperty(id) ) { cachedUsers[id] = $firebase(ref.child(id)); } return cachedUsers[id]; }; cachedUsers.$dispose = function () { angular.forEach(cachedUsers, function (user) { user.$off(); }); }; return cachedUsers; } });