recuperar query orderbychild firestore desc datos consultas firebase firebase-database firebase-realtime-database

orderbychild - Firebase Query Double Nested



orderbychild firebase (3)

Dada la estructura de datos a continuación en firebase, quiero ejecutar una consulta para recuperar el blog ''efg''. No sé la identificación de usuario en este momento.

{Users : "1234567": { name: ''Bob'', blogs: { ''abc'':{..}, ''zyx'':{..} } }, "7654321": { name: ''Frank'', blogs: { ''efg'':{..}, ''hij'':{..} } } }


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

limitToLast usar limitToLast ya que los objetos se ordenan al final cuando se usan los docs orderByChild .


En realidad es súper fácil, solo usa el preludio:

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

No necesita bucles ni nada más.


La API de Firebase solo te permite filtrar hijos de un nivel de profundidad (o con una ruta conocida ) con sus métodos orderByChild e 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 altamente ineficiente y no se escalará cuando tenga un número no trivial de usuarios / blogs.

Entonces, la solución común a eso es un llamado índice a su árbol que asigna la clave que está buscando a la ruta 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'').on(''value, function(blogSnapshot) { var daBlog = blogSnapshot.val(); }); });

También es posible que desee reconsiderar si puede reestructurar sus datos para adaptarse mejor a su caso de uso y 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 jerárquicas / NoSQL 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 relaciones de muchos a muchos en Firebase , y este artículo sobre modelado general de datos NoSQL .