Intenta entender el código bien previamente a utilizarlo a tu proyecto y si tdeseas aportar algo puedes dejarlo en los comentarios.
Solución:
La API de Firebase solo le permite filtrar niños de un nivel de profundidad (o con una ruta conocida) con su orderByChild
y equalTo
métodos.
Entonces, sin modificar / expandir su estructura de datos actual, solo deja la opción de recuperar todos los datos y filtrarlos del lado del cliente:
var ref = firebase.database().ref('Users');
ref.once('value', function(snapshot)
snapshot.forEach(function(userSnapshot)
var blogs = userSnapshot.val().blogs;
var daBlog = blogs['efg'];
);
);
Por supuesto, esto es muy ineficiente y no escalará cuando tenga un número no trivial de usuarios/blogs.
Entonces, la solución común para eso es un llamado índice para su árbol que mapea el key que buscas hasta el camino donde reside:
Blogs:
"abc": "1234567",
"zyx": "1234567",
"efg": "7654321",
"hij": "7654321"
Luego puede acceder rápidamente al blog usando:
var ref = firebase.database().ref();
ref.child('Blogs/efg').once('value', function(snapshot)
var user = snapshot.val();
ref.child('Blogs/'+user+'/blogs').once('value', function(blogSnapshot)
var daBlog = blogSnapshot.val();
);
);
También es posible que desee reconsiderar si puede reestructurar sus datos para que se ajusten mejor a su caso de uso y a las limitaciones de Firebase. Tienen una buena documentación sobre la estructuración de sus datos, pero la más importante para las personas nuevas en NoSQL/bases de datos jerárquicas parece ser “evitar construir nidos”.
También vea mi respuesta en la consulta de Firebase si child of child contiene un valor para un buen ejemplo. También recomendaría leer sobre las relaciones de muchos a muchos en Firebase y este artículo sobre el modelado general de datos NoSQL.
Dada su estructura de datos actual, puede recuperar el Usuario que contiene la publicación de blog que está buscando.
const db = firebase.database()
const usersRef = db.ref('users')
const query = usersRef.orderByChild('blogs/efg').limitToLast(1)
query.once('value').then((ss) =>
console.log(ss.val()) //=> '7654321': blogs: ...
)
necesitas usar limitToLast
ya que los objetos se ordenan en último lugar cuando se usa orderByChild
documentos
Puntuaciones y reseñas
Si te sientes a gusto, tienes la libertad de dejar un ensayo acerca de qué le añadirías a esta sección.