Indexkosten mit Map-Feldern reduzieren

Auf dieser Seite wird beschrieben, wie Sie mithilfe eines Zuordnungsfelds Indexeinstellungen für eine Gruppe von Unterfeldern verwalten.

Als Best Practice sollten Sie nicht verwendete Indexe entfernen, um die Speicherkosten zu reduzieren und die Schreibleistung zu verbessern. Standardmäßig erstellt Firestore für jedes Feld in einem Dokument einen Einzelfeldindex. Sie können die Einzelfeldindexierung durch Definition von Indexausnahmen steuern, aber mit maximal 200 Einzelfeld-Indexausnahmen pro Datenbank. Es ist möglich, dieses Limit zu erreichen, bevor Sie alle nicht verwendeten Einzelfeldindexe deaktivieren.

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

Lösung: Indexe mithilfe von Zuordnungsfeldern verwalten

Stellen Sie sich eine Anwendung vor, die von einer Sammlung von game_event-Dokumenten abhängt. Betrachten Sie die folgenden beiden 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!',
});

Zuordnungsfeld und Unterfelder

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 game_event-Dokumente immer basierend auf user_id und timestamp oder team_id und timestamp ab. Beispiele:

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 App Folgendes:

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

Gemäß diesen Indexanforderungen empfiehlt es sich, die Einzelfeldindexe für timestamp, user_id, team_id, event_type oder display_text zu deaktivieren. Vergleichen Sie nun die für die beiden Datenmodelle erforderlichen Ausnahmen.

Indexe für Felder der obersten Ebene deaktivieren

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 Unterfelder deaktivieren

Wenn Sie die Einzelfeldindexe für ein Datenmodell für Karten und Teilfelder deaktivieren möchten, können Sie eine einzelne Ausnahme für das Kartenfeld definieren. Bei einer Ausnahme für ein Kartenfeld werden die gleichen Indexierungseinstellungen auf die Unterfelder der Karte angewendet. Wenn Sie dem Feld details ein neues Unterfeld hinzufügen, wird durch die Ausnahme automatisch der Einzelfeldindex des neuen Unterfelds deaktiviert.

Fügen Sie beispielsweise in der Firebase-Befehlszeile diese Indexfreistellung der Datei firestore.indexes.json hinzu, um die Einzelfeldindexe für die Sammlung game_events zu deaktivieren:

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

Wenn du später einen Einzelfeldindex für eines der Unterfelder benötigst, kannst du die Indexeinstellung des Kartenfelds mit einer Ausnahme überschreiben. Eine Ausnahme für ein untergeordnetes Feld überschreibt dieses untergeordnete Feld und übernimmt die übernommenen Indexeinstellungen. Beispiele:

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

Wann sollte dieser Ansatz verwendet werden?

Im obigen Beispiel wurde für die Methode "Map" und "Subfields" die Anzahl der Ausnahmen von fünf auf eins reduziert. Stellen Sie sich hingegen ein ähnliches Dokumentdatenmodell mit zweihundert Feldern vor. Dieser Ansatz reduziert die Anzahl der Ausnahmen von 200 auf 1.

Sie sollten einen Ansatz mit Zuordnungs- und Teilfeldern verwenden, wenn Ihr Dokumentdatenmodell mehrere Felder mit nicht verwendeten Einzelfeldindexen enthält. Sie sollten diesen Ansatz besonders für Dokumente mit vielen Feldern berücksichtigen.