Indexkosten mit Map-Feldern reduzieren

Auf dieser Seite wird beschrieben, wie Sie mit einem Zuordnungsfeld Indexeinstellungen für eine Gruppe von Unterfeldern verwalten.

Als Best Practice sollten Sie nicht verwendete Indexe entfernen, um die Speicherkosten zu senken und die Schreibleistung zu verbessern. Standardmäßig erstellt Firestore einen Einzelfeldindex für jedes Feld in einem Dokument. Sie können die Indexierung einzelner Felder steuern, indem Sie Indexausnahmen mit maximal 200 Einzelfeldindex-Ausnahmen pro Datenbank definieren. Dieses Limit kann erreicht werden, bevor alle nicht verwendeten Einzelfeldindexe deaktiviert werden.

Sie können das Ausnahmelimit vermeiden, indem Sie Dokumentfelder mit denselben Indexanforderungen unter einem Kartenfeld gruppieren. Sie können dann eine Indexausnahme auf das Kartenfeld anwenden und dieselbe Ausnahme gilt für die Unterfelder der Karte.

Lösung: Kartenfelder zur Verwaltung von Indexen verwenden

Stellen Sie sich eine Anwendung vor, die von einer Sammlung von game_event-Dokumenten abhängt. Betrachten Sie die folgenden zwei Datenmodelle:

Dokumentfelder der obersten Ebene

Node.js
db.collection('game_events').doc().set({
   timestamp: Firestore.FieldValue.serverTimestamp(),
   user_id: 'huDIl8H88kFAFAdcHayf',
   team_id: '6Q5BhBESeTPk8LT0O59I',
   event_type: 'rare_item_drop',
   display_text: 'You found a rare item!',
});

Kartenfeld und untergeordnete Felder

In diesem Datenmodell werden alle Dokumentfelder zu untergeordneten Feldern des Felds details:

Node.js
db.collection('game_events').doc().set({
  details: {
    timestamp: Firestore.FieldValue.serverTimestamp(),
    user_id: 'huDIl8H88kFAFAdcHayf',
    team_id: '6Q5BhBESeTPk8LT0O59I',
    event_type: 'rare_item_drop',
    display_text: 'You found a rare item!',
  }
});

Angenommen, diese Anwendung fragt immer game_event-Dokumente basierend auf user_id und timestamp oder team_id und timestamp ab. Beispiel:

Node.js
let query_user_events = db.collection('game_events')
                          .where('details.user_id', '==', 'huDIl8H88kFAFAdcHayf')
                          .orderBy('details.timestamp');

let query_team_events = db.collection('game_events')
                          .where('details.team_id', '==', '6Q5BhBESeTPk8LT0O59I')
                          .orderBy('details.timestamp');

Beachten Sie bei dieser Anwendung Folgendes:

  • Die Anwendung hängt von den zusammengesetzten Indexen für details.user_id, timestamp und details.team_id, timestamp ab.
  • Die Anwendung verwendet keine Einzelfeldindexe für timestamp, user_id, team_id, event_type oder display_text.

Basierend auf diesen Indexanforderungen empfiehlt es sich, die Indexe für einzelne Felder für timestamp, user_id, team_id, event_type oder display_text zu deaktivieren. Vergleichen Sie nun die Ausnahmen für die beiden Datenmodelle.

Indexe für Felder der obersten Ebene werden deaktiviert

Wenn Sie die Einzelfeldindexe in einem Datenmodell der obersten Ebene deaktivieren möchten, müssen Sie für jedes Feld eine Ausnahme definieren. Die Anzahl der Ausnahmen erhöht sich um fünf. Wenn Sie Ihrem Datenmodell ein neues Feld hinzufügen, müssen Sie eine weitere Ausnahme definieren, um den Einzelfeldindex zu deaktivieren.

Indexe für untergeordnete Felder deaktivieren

Um die Einzelfeldindexe für ein Daten- und Unterfelderdatenmodell zu deaktivieren, können Sie eine einzelne Ausnahme für das Zuordnungsfeld definieren. Eine Ausnahme von einem Kartenfeld wendet dieselben Indexierungseinstellungen auf die Unterfelder der Karte an. Wenn Sie ein neues Unterfeld zum Feld details hinzufügen, wird die Ausnahme durch den Einzelfeldindex des neuen Unterfelds automatisch deaktiviert.

Fügen Sie beispielsweise mit der Firebase CLI der Indexdatei firestore.indexes.json diese Indexausnahme hinzu, um die Einzelfeldindexe für die Sammlung game_events zu deaktivieren:

{
    "collectionGroup": "game_events",
    "fieldPath": "details",
    "indexes": []
},

Wenn Sie später einen Einzelfeldindex für eines der Unterfelder benötigen, können Sie die Indexeinstellung des Kartenfelds mit einer Ausnahme überschreiben. Eine Ausnahme für ein Unterfeld überschreibt die übernommenen Indexeinstellungen dieses Unterfelds. Beispiel:

{
    "collectionGroup": "game_events",
    "fieldPath": "details.event_type",
    "indexes": [
      {
        "order": "ASCENDING",
        "queryScope": "COLLECTION"
      },
    ]
},

Wann ist dieser Ansatz zu verwenden?

Im obigen Beispiel verringerten die Karten- und Unterfelder die Anzahl der Ausnahmen von fünf auf eins. Stellen Sie sich beispielsweise ein ähnliches Dokumentdatenmodell mit zwei hundert verschachtelten Feldern vor. Dieser Ansatz reduziert die Anzahl der Ausnahmen von 200 auf 1.

Wenn Ihr Dokumentdatenmodell mehrere Felder mit nicht verwendeten Einzelfeldindizes enthält, sollten Sie die Verwendung eines Zuordnungsfelds und von Teilfeldern in Betracht ziehen. Dieser Ansatz eignet sich besonders für Dokumente mit vielen Feldern.