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.

Documentación

https://firebase.google.com/docs/firestore