J'ai travaillé sur la transition d'un petit projet Firebase vers la nouvelle base de données Firestore similaire en raison de sa nature plus interrogeable, mais j'ai un problème avec un problème de requête simple.
J'essaie d'obtenir tous les documents d'une collection, dans le cas où chaque document est un club et la collection est tous les clubs.
Dans Firebase, j'ai pu faire quelque chose comme:
export function fetchClubs() {
const Club = firestore.ref('clubs');
return dispatch => {
Club.on('value', snapshot => {
dispatch({
type: FETCH_CLUBS,
payload: snapshot.val()
})
})
}
}
snapshot
contiendrait toutes les informations dont j'avais besoin.
J'essaie de reproduire cela avec Firestore, mais je n'ai pu trouver qu'une solution qui implique de créer un nouveau tableau et de parcourir les résultats en ajoutant ensuite chaque résultat à cela.
Voici ma tentative Firestore en utilisant la syntaxe Firestore légèrement différente
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot)
dispatch({
type: FETCH_CLUBS,
payload: querySnapshot.val()
})
})
}
}
Si vous avez des idées, toute aide sera grandement appréciée! Merci!
(c'est mon premier post stackoverflow, allez-y doucement! :))
Éditer:
Exemple tiré des documents Firestore sur la façon d'obtenir tous les documents d'une collection.
db.collection("cities").where("capital", "==", true)
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
Modifier 2:
Ma nouvelle solution pour obtenir les documents dans un tableau utilisable en utilisant .docs et .data (). Cela semble toujours inefficace, car je dois parcourir les doutes et extraire les informations utilisables une par une.
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
var clubs = [];
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot.docs)
_.each(querySnapshot.docs, function(data){
clubs.Push(data.data());
})
dispatch({
type: FETCH_CLUBS,
payload: clubs
})
})
}
}
La différence entre Firebase Realtime Database et Firestore est que RTDB est fondamentalement juste un objet JSON hébergé dans le cloud. Il n'y a donc pas de concept de documents et il n'y a pas de recueil de données.
L'objet valeur dans un instantané de requête que vous récupérez à partir de RTDB n'est qu'un objet JSON. Par conséquent, vous pouvez accéder aux nœuds de premier niveau par leurs clés (et également à tous les nœuds de niveau par leurs clés)
Si vous venez de RTDB, vous remarquerez la différence que Cloud Firestore possède des collections et des documents. Ainsi, les résultats de votre requête seront intrinsèquement des collections de données plutôt qu'un objet JSON. Les documents récupérés à partir d'une requête ne peuvent pas être récupérés comme un seul grand objet JSON.
Faire une boucle sur le résultat de la requête est la bonne façon de travailler avec Cloud Firestore.