Pesquisa de site

typescript - Como posso ordenar por um elemento de array com Angular


Eu tenho este documento do Firebase, e quero ordenar pelo campo de texto do primeiro elemento do array name, ou seja, o nome oficial.

Aqui está o código que estou tentando usar, mas não está funcionando:

get(collectionName: string): Observable<T[]> {
    return this.afs.collection(collectionName, ref => {
      let query: CollectionReference | Query = ref;
      query = query.orderBy('text', 'asc').where('name', 'array-contains', 'official');
      return query;
    }).valueChanges() as Observable<T[]>;
}

Resposta #1

Consultar e ordenar por valores de objetos dentro de arrays não é possível com o Firestore, pelo menos não diretamente, como você pode ver nesta resposta da comunidade:

As operações array-contains verificam se um array contém um valor específico (completo). Elas não podem verificar se um array de objetos contém um item com um valor específico para uma propriedade.

O mesmo se aplica ao orderBy. Então, para fazer isso, você precisará mudar a estrutura do seu Firestore, uma possibilidade é criar um campo separado que não seja um array e que contenha o valor pelo qual a consulta deve ser ordenada/consultada, você também pode criar uma subcoleção para representar os valores do array, mas isso cabe a você decidir dependendo da sua estrutura.