Pular para o conteúdo

Filtros múltiplos nas visualizações de coleção

O Firestore tem algumas limitações com filtragem e ordenação, limitado a uma única cláusula where por consulta por padrão. Isso significa que filtrar por múltiplos campos não é possível nativamente. Esta é uma limitação do Firestore, não do FireCMS.

A partir do FireCMS 3.0, se você não definir os índices manualmente, o FireCMS tentará executar sua consulta mesmo assim; se falhar, mostrará um link para o console do Firestore para criar os índices necessários.

Se você deseja limitar as operações de UI que podem ser realizadas em uma coleção, com base nos seus índices existentes, pode defini-los no FireCMS usando um FirestoreIndexesBuilder. Este é um builder que permite declarar seus índices do Firestore. Se você definir seus índices, o FireCMS permitirá apenas filtrar pelos campos que você definiu, ou campos que podem ser filtrados e ordenados sem índices.

Este é um exemplo de como você pode definir um FirestoreIndexesBuilder. Depois, pode retornar um array de índices que serão usados para filtrar a coleção.

import { FirestoreIndexesBuilder } from "@firecms/firebase";
// Builder de índices que permite filtragem por `category` e `available` para a coleção `products`
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
// Para 2 campos, você precisa definir 4 índices (eu sei...)
return [
{
category: "asc",
available: "desc"
},
{
category: "asc",
available: "asc"
},
{
category: "desc",
available: "desc"
},
{
category: "desc",
available: "asc"
}
];
}
return undefined;
}
import { FirestoreIndexesBuilder, useFirestoreDelegate } from "@firecms/firebase";
// ...
// Builder de índices de exemplo
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
return [
{
category: "asc",
available: "desc"
},
{
category: "asc",
available: "asc"
},
{
category: "desc",
available: "desc"
},
{
category: "desc",
available: "asc"
}
];
}
return undefined;
}
// Delegado usado para buscar e salvar dados no Firestore
const firestoreDelegate = useFirestoreDelegate({
// ...
firestoreIndexesBuilder
});
// ...
import { FireCMSCloudApp } from "@firecms/cloud";
import { FirestoreIndexesBuilder } from "@firecms/firebase";
// Builder de índices de exemplo
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
return [
{
category: "asc",
available: "desc"
},
{
category: "asc",
available: "asc"
},
{
category: "desc",
available: "desc"
},
{
category: "desc",
available: "asc"
}
];
}
return undefined;
}
// Adiciona seu builder de índices à sua aplicação
function MyApp() {
return <FireCMSCloudApp
// ...
firestoreIndexesBuilder={firestoreIndexesBuilder}
// ...
/>;
}