Cette série d'articles est indexée sur NgateSystems.com. Vous y trouverez également une fonction de recherche par mot-clé très utile.
Dernière révision : 24 novembre
La documentation en ligne complète de Google pour les instructions Firestore CRUD (créer, lire, mettre à jour, supprimer) peut être trop détaillée pour une utilisation quotidienne. Voici des modèles pour les fonctions les plus importantes de Firestore. Je vous suggère de les couper et de les coller tels quels, puis de remplacer le mot « mon » dans les noms de variables par une contraction appropriée du nom de la collection que vous ciblez. Par exemple, les références à une collection appelée « Lecture_events » peuvent être codées comme « lecEvtsCollRef ».
Pour créer un document contenant un objet myDocData avec un identifiant généré automatiquement :
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
Notez que, de manière confuse, la documentation Google sur « Ajout de données » fait référence à une fonction addDoc comme alternative à setDoc. Consultez le post-scriptum ci-dessous pour savoir pourquoi setDocis est préféré.
Dans l'extrait de code ci-dessus, l'instruction myDocRef= est le point auquel un identifiant automatique est alloué. Si vous avez besoin de trouver la valeur qui a été attribuée, vous la trouverez sur myDocRef.id. Encore une fois, consultez le post-scriptum ci-dessous pour plus d'informations sur ce point.
Pour créer un document avec une donnée comme identifiant :
let myDocData = .... create a data object ..... let myDocumentIdentifier = .... create your identifier .... const myDocRef = doc(db, "myCollectionName", myDocumentIdentifier) await setDoc(myDocRef, myDocData);
Pour récupérer un document individuel à l'aide de son identifiant de document :
const myDocRef = doc(db, "myCollectionName", myDocId); const myDoc = await getDoc(myDocRef); if (myDoc.exists()) { console.log("Document data:", myDoc.data()); }
Pour récupérer une sélection de documents avec des critères de sélection et de classement (exemple) :
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef, where("myField1Name", "==", myField1Value), orderBy("myField2Name", "asc")); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " => ", myDoc.data()); });
Dans forEach d'un instantané, les données d'un document sont disponibles sous myDoc.data(), le docRef du document est myDoc.ref et son docId est myDoc.id. Si vous souhaitez simplement déterminer l'existence de documents qui correspondent aux critères de sélection, une astuce utile consiste à vérifier si mySnapshot.size est différent de zéro.
Si vous souhaitez faire référence à des documents individuels dans le tableau d'instantanés, vous trouverez les données de la nième entrée dans mySnapshot.docs[n].data() et son identifiant dans mySnapshot.docs[n]. identifiant
Notez que si vous ne spécifiez pas de champ orderBy, les documents seront renvoyés par ordre croissant de docId. Et si vous incluez plusieurs champs Where, vous devez créer un index (composé). L'outil d'inspection du navigateur vous aidera ici. Il vous suffit de suivre le lien dans le message d'erreur "index-needed". Les champs individuels sont indexés automatiquement dans une base de données Firestore.
Pour récupérer tous les documents d'une collection :
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " >= ", myDoc.data()); });
Les opérateurs de comparaison Firestore sont "==", ">" , "<", "<=", ">=" et "!=", ainsi que quelques opérateurs d'appartenance à un tableau intéressants.
Pour récupérer tous les documents dans une hiérarchie de collections et puis faire quelque chose :
Vous devez être prudent lorsque vous souhaitez effectuer une certaine action après le traitement sur une hiérarchie multi-niveaux de collections est terminé. Si votre code contient de nombreuses instructions foreach imbriquées, chacune contenant une instruction wait, vous ne pouvez pas compter sur l'attente individuelle pour vous indiquer quand l'ensemble est terminé. Chacune de ces attentes individuelles occupe un fil de discussion distinct et celles-ci ne communiquent pas directement les unes avec les autres de manière utile.
Une solution à ce problème consiste à utiliser la boucle for traditionnelle sur vos instantanés plutôt que forEachs. Voici un exemple ciblant tous les enfants d'une sous-collection avant d'effectuer une action
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
Ici, vous pouvez compter sur vos attentes pour être exécutées dans un ordre strict, et lorsque vous atteignez la fin de la boucle, vous savez que vous pouvez continuer en toute confiance pour effectuer votre action dépendante. Mais les performances créées par cela peuvent être significatives et vous pourriez donc être intéressé par l'arrangement suivant :
Vous pouvez avoir une idée des promesses individuelles lancées par les attentes dans une boucle forEach en les stockant dans un tableau. Vous pouvez ensuite appliquer une instruction wait Promise.all à ce tableau pour savoir quand toutes les promesses de ses membres sont terminées. Il est impossible de fournir ici un modèle simple adapté à toutes les circonstances, mais ce qui suit est un « croquis » qui illustre les grands principes.
Ici, une hiérarchie à deux niveaux impliquant deux collections distinctes (parents et enfants) est liée par un champ parentsId commun. Les deux collections sont lues en mémoire pour permettre l'analyse de l'agrégat. Cela ne peut être fait que lorsque tous les enfants ont été lus.
let myDocData = .... create a data object ..... let myDocumentIdentifier = .... create your identifier .... const myDocRef = doc(db, "myCollectionName", myDocumentIdentifier) await setDoc(myDocRef, myDocData);
Exemple - pour modifier la valeur de la propriété myField dans le contenu myDocData d'un document
const myDocRef = doc(db, "myCollectionName", myDocId); const myDoc = await getDoc(myDocRef); if (myDoc.exists()) { console.log("Document data:", myDoc.data()); }
Exemple - pour remplacer tout le contenu du document myDocId par un nouvel objet contenant uniquement une propriété myField
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef, where("myField1Name", "==", myField1Value), orderBy("myField2Name", "asc")); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " => ", myDoc.data()); });
Vous pouvez appliquer des modifications à plusieurs champs simultanément en remplaçant le bit {myField: myFieldValue} dans les exemples ci-dessus par un objet contenant les champs que vous souhaitez modifier.
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " >= ", myDoc.data()); });
A l'intérieur d'une transaction, les modèles introduits ci-dessus restent inchangés mais les commandes setDoc sont modifiées comme suit :
Dans le runTransaction(db, async (transaction) => { ... }).catch(); fonction :
Comme mentionné ci-dessus, Google fournit les fonctions addDoc() et updateDoc() pour la création et la mise à jour de documents en parallèle avec setDoc(). Mais cela semble inutilement déroutant lorsque setDoc peut effectuer les deux opérations. De plus, en ce qui concerne les transactions, addDoc() ne peut être utilisé que pour créer des documents avec des identifiants automatiques. Il semble plus simple, en pratique, d'utiliser setDoc partout.
Vous avez peut-être remarqué qu'il n'y a pas d'attente sur l'appel doc(myCollRef) qui crée un identifiant de document Firestore. Cela vous indique que Firestore parvient d'une manière ou d'une autre à le faire sans réellement visiter la collection et voir ce qui est déjà utilisé. Si vous êtes curieux de savoir comment il gère cela, vous aimeriez peut-être consulter la discussion sur StackOverflow.
Ajouter des données à Cloud Firestore : https://firebase.google.com/docs/firestore/manage-data/add-data
Lire les données avec Cloud Firestore : https://firebase.google.com/docs/firestore/query-data/get-data
Supprimer les données de Cloud Firestore : https://firebase.google.com/docs/firestore/manage-data/delete-data
La documentation du SDK est disponible à l'adresse :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!