Saltar al contenido

Consulta de Firebase doblemente anidada

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *