Cómo consultar a firebase por la propiedad con valor específico dentro de todos los niños

Tengo esta estructura de datos, donde todos están organizados para seguir path / todos / uid /

{ "metausers" : { "simplelogin:1" : { "displayName" : "John Doe", "provider" : "password", "provider_id" : "1" }, "simplelogin:2" : { "displayName" : "GI Jane", "provider" : "password", "provider_id" : "2" } }, "todos" : { "simplelogin:1" : { "-JUAfv4_-ZUlH7JqM4WZ" : { "completed" : false, "done" : false, "group" : false, "private" : false, "subject" : "First" }, "-JUAfveXP_sqqX32jCJS" : { "completed" : false, "done" : false, "group" : false, "private" : true, "subject" : "Second" }, "-JUAfwXnMo6P53Qz6Fd2" : { "completed" : false, "done" : false, "group" : false, "private" : false, "subject" : "Third" } }, "simplelogin:2" : { "-JUAg9rVemiNQykfvvHs" : { "completed" : false, "done" : false, "group" : false, "private" : false, "subject" : "Q first" }, "-JUAgAmgPwZLPr2iH1Ho" : { "completed" : false, "done" : false, "group" : false, "private" : false, "subject" : "Q second" }, "-JUAgBfF8f7V5R5-XgrY" : { "completed" : false, "done" : false, "group" : false, "private" : true, "subject" : "Q third" } } } } 

y me gustaría consultar todos para obtener todos los registros con private:true . ¿Es esto posible usar firebase (fuego angular) y cómo debería hacerlo? ¿O debería desnormalizar un poco más y organizar el camino / privado para evitar caminar por todos?

No hay cláusulas WHERE en Firebase. Eche un vistazo a este hilo para ver algunos consejos estructurales excelentes sobre la búsqueda por varios campos, este hilo en las consultas de estilo de la base de datos, este blog en las consultas y los documentos .

Su primer enfoque debería ser segmentar los datos de cómo se leerán. Algo como lo siguiente:

 /todos/public /todos/private /todos/completed 

También puede utilizar prioridades como se explica en los documentos. Luego busque los artículos según la prioridad.

Si la lista es menor a mil, que debería ser si los datos están particionados correctamente, probablemente puedas simplemente tomar la lista de cosas pendientes y filtrarla también en el cliente, una gran opción para colecciones cortas como esta, particularmente cuando se trabaja con una gran librativa vinculante como Angular.

Suponiendo que tiene el uid, esto debería ser sencillo con lo siguiente:

 var uid = "simplelogin:1"; var todosRef = new Firebase("https://yourdb.firebaseio.com/todos/" + uid); var privateTodosRef = todosRef.orderByChild("private").equalTo(true); var privateTodos; privateTodosRef.on("value", function(response) { privateTodos = response.val(); }); 

Esto debería devolver un objeto con todos los privados de este usuario, organizados por su clave de "-JUAfv4_-ZUlH7JqM4WZ" (es decir, "-JUAfv4_-ZUlH7JqM4WZ" . Si desea usar Angularfire, puede envolver esto en un $ firebaseArray y asignarlo de la siguiente manera:

 $scope.privateTodos = $firebaseArray(privateTodosRef); 

Aquí hay una referencia para obtener más información sobre consultas complejas, y como se menciona en las otras respuestas, hay algunas buenas optimizaciones que se pueden hacer con prioridades y reestructuración.

Feliz encoding!

Se puede acceder a todos los datos en Firebaase por URL. Si va a su tablero de Firebase para ver su modelo de datos (Forge) y hace clic en la propiedad que le interesa, se le redirigirá a una URL mediante la cual puede acceder a esta información en particular, por ejemplo, https: //myapp.firebaseio. com / todos / simplelogin: 1 / -JUAg9rVemiNQykfvvHs / privado . Teniendo esto en cuenta, puede acceder a estos datos con AngularFire.