Consulta de Firebase doblemente anidada
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':{..}
}
}
}
La API de Firebase solo le permite filtrar elementos secundarios de un nivel de profundidad (o con una ruta conocida ) con sus métodos orderByChild
y 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 .
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 limitToLast
ya que los objetos se ordenan al final cuando usa orderByChild
documentos .
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.