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 .