Maison > interface Web > js tutoriel > NgSysV : modèles Firestore CRUD

NgSysV : modèles Firestore CRUD

Linda Hamilton
Libérer: 2024-12-04 05:31:15
original
945 Les gens l'ont consulté

NgSysV: Firestore CRUD templates

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

Introduction

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 ».

Création de documents

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);
Copier après la connexion
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

Lecture de documents

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());
} 
Copier après la connexion
Copier après la connexion

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());
});
Copier après la connexion
Copier après la connexion

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());
});
Copier après la connexion
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

Mettre à jour un document

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());
} 
Copier après la connexion
Copier après la connexion

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());
});
Copier après la connexion
Copier après la connexion

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.

Supprimer un document

const myCollRef = collection(db, "myCollectionName");
const myQuery = query(myCollRef);
const mySnapshot = await getDocs(myQuery);
mySnapshot.forEach((myDoc) => {
  console.log(myDoc.id, " >= ", myDoc.data());
});
Copier après la connexion
Copier après la connexion

Opérations CRUD dans les transactions

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 :

  • getDoc est remplacé par transaction.get()
  • setDoc est remplacé par transaction.set()
  • deleteDoc est remplacé par transaction.delete()

Post-scriptum

  1. 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.

  2. 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.

Références de la documentation Google

  • 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 :

  • https://firebase.google.com/docs/reference/js/firestore_ et
  • https://firebase.google.com/docs/reference/js/firestore_.transaction

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal