Étant donné la structure de données ci-dessous dans Firebase, je souhaite exécuter une requête pour extraire le blog "efg". Je ne connais pas l'identifiant de l'utilisateur à ce stade.
{Users :
"1234567": {
name: 'Bob',
blogs: {
'abc':{..},
'zyx':{..}
}
},
"7654321": {
name: 'Frank',
blogs: {
'efg':{..},
'hij':{..}
}
}
}
L'API Firebase vous permet uniquement de filtrer les enfants au niveau le plus profond (ou avec un chemin connu ) avec ses méthodes orderByChild
et equalTo
.
Donc, sans modifier/développer votre structure de données actuelle, cela laisse simplement la possibilité de récupérer toutes les données et de les filtrer côté client:
var ref = firebase.database().ref('Users');
ref.once('value', function(snapshot) {
snapshot.forEach(function(userSnapshot) {
var blogs = userSnapshot.val().blogs;
var daBlog = blogs['efg'];
});
});
Ceci est bien sûr très inefficace et n’évolue pas lorsque vous avez un nombre non négligeable d’utilisateurs/blogs.
La solution courante consiste donc à créer un index dans votre arborescence qui mappe la clé que vous recherchez sur le chemin où elle réside:
{Blogs:
"abc": "1234567",
"zyx": "1234567",
"efg": "7654321",
"hij": "7654321"
}
Ensuite, vous pouvez accéder rapidement au blog en utilisant:
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();
});
});
Vous voudrez peut-être également reconsidérer la possibilité de restructurer vos données pour mieux les adapter à votre cas d'utilisation et aux limites de Firebase. Ils ont une bonne documentation sur la structuration de vos données, mais la plus importante pour les débutants en bases de données hiérarchiques NoSQL/semble être "éviter de construire des nids" .
Voir aussi ma réponse sur Requête Firebase si child of child contient une valeur pour un bon exemple. Je vous recommande également de lire les liens plusieurs à plusieurs dans Firebase et cet article sur la modélisation de données générale NoSQL .
En fonction de votre structure de données actuelle, vous pouvez récupérer l'utilisateur qui contient la publication de blog que vous recherchez.
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: {...}}}
})
Vous devez utiliser limitToLast
car les objets sont triés en dernier lorsque vous utilisez orderByChild
docs .