맵 필드로 색인 비용 절감

이 페이지에서는 맵 필드를 사용하여 하위 필드 그룹의 색인 설정을 관리하는 방법을 설명합니다.

미사용 색인을 삭제하여 저장소 비용을 줄이고 쓰기 성능을 개선하는 것이 좋습니다. 기본적으로 Firestore는 문서의 각 필드에 단일 필드 색인을 빌드합니다. 색인 예외는 정의하되 데이터베이스당 최대 200개의 단일 필드 색인 예외를 사용하여 단일 필드 색인 생성을 제어할 수 있습니다. 이렇게 할 경우 미사용 단일 필드 색인을 모두 사용 중지하기 전에 이 한도에 도달할 수 있습니다.

맵 필드에 동일한 색인 요구사항을 지정하여 문서 필드를 그룹화하면 이 예외 한도에 도달하지 않도록 할 수 있습니다. 그런 다음 색인 예외를 맵 필드에 적용하면 맵의 하위 필드에 동일한 예외가 적용됩니다.

해결 방법: 맵 필드를 사용하여 색인 관리

앱에서 game_event 문서 컬렉션을 사용한다고 가정합니다. 다음 두 가지 데이터 모델을 고려하세요.

최상위 문서 필드

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!',
});

맵 필드 및 하위 필드

이 데이터 모델에서 모든 문서 필드는 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!',
  }
});

이 앱은 항상 user_idtimestamp 또는 team_idtimestamp를 기반으로 game_event 문서를 쿼리한다고 가정합니다. 예를 들면 다음과 같습니다.

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');

이 앱과 관련하여 다음 사항을 참고하세요.

  • 앱은 details.user_id, timestampdetails.team_id, timestamp의 복합 색인을 사용합니다.
  • 앱은 timestamp, user_id, team_id, event_type 또는 display_text에 단일 필드 색인을 사용하지 않습니다.

이러한 색인 요구사항에 따라 timestamp, user_id, team_id, event_type 또는 display_text에 대한 단일 필드 색인을 사용 중지하는 것이 좋습니다. 이제 두 데이터 모델에 필요한 예외를 비교합니다.

최상위 필드의 색인 사용 중지

최상위 필드 데이터 모델에서 단일 필드 색인을 사용 중지하려면 각 필드에 예외를 정의해야 합니다. 예외 수가 5만큼 증가하고 데이터 모델에 새 필드를 추가하는 경우 단일 필드 색인을 사용 중지하려면 다른 예외를 정의해야 합니다.

하위 필드의 색인 사용 중지

맵 및 하위 필드 데이터 모델에 대한 단일 필드 색인을 사용 중지하려면 맵 필드에 단일 예외를 정의하면 됩니다. 맵 필드의 예외와 동일 색인 설정이 맵의 하위 필드에도 적용됩니다. details 필드에 새 하위 필드를 추가하면 예외에 의해 새 하위 필드의 단일 필드 색인이 자동으로 사용 중지됩니다.

예를 들어 Firebase CLI를 사용하여 이 색인 예외를 firestore.indexes.json 파일에 추가하면 game_events 컬렉션에서 단일 필드 색인이 사용 중지됩니다.

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

나중에 하위 필드 중 하나에 단일 필드 색인이 필요하면 예외를 사용하여 맵 필드의 색인 설정을 재정의할 수 있습니다. 하위 필드의 예외는 해당 하위 필드의 상속된 색인 설정을 재정의합니다. 예를 들면 다음과 같습니다.

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

이 접근 방식을 사용해야 하는 경우

위의 예시에 사용된 맵 및 하위 필드 접근 방식에서는 예외 수를 5개에서 1개로 줄였습니다. 하지만 수백 개의 필드가 있는 유사한 문서 데이터 모델이 있다면 이 접근 방식에서는 예외 수를 200개에서 1개로 줄입니다.

문서 데이터 모델에 미사용 단일 필드 색인이 있는 여러 필드가 포함된 경우 맵 필드와 하위 필드 접근 방식을 사용하는 것이 좋습니다. 특히 필드가 여러 개인 문서에는 이러한 접근 방식을 고려하는 것이 좋습니다.