Firestore - djsordo/senda GitHub Wiki
Algunas notas sobre desarrollo de consultas con firestore
Nota número uno: las librerías son importantes
Al escribir código, probablemente verás que hay varias recomendaciones
a la hora de resolver una llamada a una función. Por ejemplo,
si escribimos deleteDoc
aparecerá una referencia a
@angular/fire/firestore
y otra a firebase/firestore
:
lo importante es mantenerse fiel a una de las dos librerías,
ya que hay diferencias sutiles que pueden hacer de tu vida un
infierno.
Por ejemplo, este código para borrar un equipo:
const q = query( this.equipoRef, where( "nombre", "==", nombre ));
let docList = getDocs( q )
.then( (docList) => {
docList.forEach( (docRef) => {
deleteDoc( docRef.ref );
})
})
No va a funcionar si deleteDoc
está importado de firebase/firestore
.
REGLA DE ORO: sugiero que todas las funciones las importaremos de
@angular/fire/firestore
.
Nota número dos: algunos ejemplos
Traer todos los documentos cuyo nombre sea igual a algo
async getEquipoByName( nombre : string ){
const q = query( this.equipoRef, where( "nombre", "==", nombre ) );
return getDocs(q);
}
Borrar un documento por nombre
async deleteEquipoByName( nombre : string ){
const q = query( this.equipoRef, where( "nombre", "==", nombre ));
let docList = getDocs( q )
.then( (docList) => {
docList.forEach( (docRef) => {
deleteDoc( docRef.ref );
})
})
}
Actualizar un campo en un documento
pendiente
Búsquedas
Las consultas sólo admiten estos operadores:
- < less than
- <= less than or equal to
- == equal to
- > greater than
- >= greater than or equal to
- != not equal to
- array-contains
- array-contains-any
- in
- not-in
Esto, a mi modo de ver, puede ser un problema a la hora de buscar
por nombre: "María" != "Maria"
(las marcas diacríticas son
significativas), "Maria" != "maria"
(las mayúsculas son
significativas).
Afortunadamente, podemos suponer que la codificación de los textos nos la da resuelta javascript.
Hacer un test (un fichero .spec.ts)
No hace falta levantar la aplicación para ver si añadir un documento está funcionando.... es más, si construimos un test, en cualquier momento podemos volver al test y verificar si con un cambio no hemos roto nada.
Esqueleto del test
fdescribe( 'PruebasDeMiServicio', () => {
let miServicio : TU-CLASE-DE-SERVICIO-AQUI;
beforeEach( () => {
TestBed.configureTestingModule({
imports: [ provideFirebaseApp(() => initializeApp(environment.firebaseConfig)),
provideFirestore(() => getFirestore()) ]
});
miServicio = TestBed.inject( TU-CLASE-DE-SERVICIO-AQUI );
});
});
Debe reemplazarse TU-CLASE-DE-SERVICIO-AQUI
por la clase que
se quiera testar. La variable miServicio
representará el
servicio bajo pruebas, puede ponerse el nombre que queramos.