Zum Inhalt springen

Mehrere Filter in Kollektionsansichten

Firestore ist etwas eingeschränkt beim Filtern und Sortieren – standardmäßig auf eine einzige where-Klausel pro Abfrage begrenzt. Das bedeutet, dass das Filtern nach mehreren Feldern nicht von Haus aus möglich ist. Dies ist eine Einschränkung von Firestore, nicht von FireCMS.

Seit FireCMS 3.0 versucht FireCMS, Ihre Abfrage trotzdem auszuführen, wenn Sie keine Indexes manuell definieren. Wenn sie fehlschlägt, wird ein Link zur Firestore-Konsole angezeigt, um die erforderlichen Indexes zu erstellen.

Wenn Sie die UI-Operationen einschränken möchten, die in einer Kollektion ausgeführt werden können, basierend auf Ihren vorhandenen Indexes, können Sie diese in FireCMS definieren, indem Sie einen FirestoreIndexesBuilder verwenden. Dies ist ein Builder, mit dem Sie Ihre Firestore-Indexes deklarieren können. Wenn Sie Ihre Indexes definieren, erlaubt FireCMS Ihnen nur, nach den Feldern zu filtern, die Sie definiert haben, oder den Feldern, die ohne Indexes gefiltert und sortiert werden können.

Dies ist ein Beispiel, wie Sie einen FirestoreIndexesBuilder definieren können. Sie können dann ein Array von Indexes zurückgeben, das für die Filterung der Kollektion verwendet wird.

import { FirestoreIndexesBuilder } from "@firecms/firebase";
// Beispiel-Index-Builder, der die Filterung nach `category` und `available` für die `products`-Kollektion erlaubt
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
// Für 2 Felder müssen Sie 4 Indexes definieren (ich weiß...)
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";
// ...
// Beispiel-Index-Builder, der die Filterung nach `category` und `available` für die `products`-Kollektion erlaubt
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
// Für 2 Felder müssen Sie 4 Indexes definieren (ich weiß...)
return [
{
category: "asc",
available: "desc"
},
{
category: "asc",
available: "asc"
},
{
category: "desc",
available: "desc"
},
{
category: "desc",
available: "asc"
}
];
}
return undefined;
}
// Delegate für das Abrufen und Speichern von Daten in Firestore
const firestoreDelegate = useFirestoreDelegate({
// ...
firestoreIndexesBuilder
});
// ...
import { FireCMSCloudApp } from "@firecms/cloud";
import { FirestoreIndexesBuilder } from "@firecms/firebase";
// Beispiel-Index-Builder, der die Filterung nach `category` und `available` für die `products`-Kollektion erlaubt
const firestoreIndexesBuilder: FirestoreIndexesBuilder = ({ path }) => {
if (path === "products") {
// Für 2 Felder müssen Sie 4 Indexes definieren (ich weiß...)
return [
{
category: "asc",
available: "desc"
},
{
category: "asc",
available: "asc"
},
{
category: "desc",
available: "desc"
},
{
category: "desc",
available: "asc"
}
];
}
return undefined;
}
// Fügen Sie Ihren Index-Builder zur App hinzu
function MyApp() {
return <FireCMSCloudApp
// ...
firestoreIndexesBuilder={firestoreIndexesBuilder}
// ...
/>;
}