Consulta de Firebase doblemente anidada

Resuelto Chris Raheb asked hace 54 años • 3 respuestas

Dada la siguiente estructura de datos en Firebase, quiero ejecutar una consulta para recuperar el blog 'efg'. No conozco la identificación del usuario en este momento.

{Users :
     "1234567": {
          name: 'Bob',
          blogs: {
               'abc':{..},
               'zyx':{..}
          }
     },
     "7654321": {
          name: 'Frank',
          blogs: {
               'efg':{..},
               'hij':{..}
          }
     }
}
Chris Raheb avatar Jan 01 '70 08:01 Chris Raheb
Aceptado

La API de Firebase solo le permite filtrar elementos secundarios de un nivel de profundidad (o con una ruta conocida ) con sus métodos orderByChildy equalTo.

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 una cantidad no trivial de usuarios/blogs.

Entonces, la solución común es un llamado índice de su árbol que asigna la clave que está buscando a la ruta donde reside:

{Blogs:
     "abc": "1234567",
     "zyx": "1234567",
     "efg": "7654321",
     "hij": "7654321"
}

Luego podrás 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();
    });
});

Es posible que también desee reconsiderar si puede reestructurar sus datos para que se ajusten mejor a su caso de uso y a las limitaciones de Firebase. Tienen buena documentación sobre la estructuración de sus datos, pero la más importante para las personas nuevas en las bases de datos NoSQL/jerárquicas parece ser "evitar la construcción de nidos" .

Consulte también mi respuesta sobre la consulta de Firebase si el hijo del hijo contiene un valor para ver un buen ejemplo. También recomendaría leer sobre las relaciones de muchos a muchos en Firebase y este artículo sobre modelado de datos NoSQL general .

Frank van Puffelen avatar Nov 29 '2014 23:11 Frank van Puffelen

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: {...}}}
})

Debe usarlo limitToLastya que los objetos se ordenan al final cuando usa orderByChild documentos .

Bryan Massoth avatar Jun 20 '2018 17:06 Bryan Massoth

En realidad, es súper fácil: solo usa la barra anterior:

db.ref('Users').child("userid/name")
db.ref('Users').child("userid/blogs")
db.ref('Users').child("userid/blogs/abc")

No hay necesidad de bucles ni nada más.

nyagolova avatar Aug 23 '2019 12:08 nyagolova