맵 필드로 색인 비용 절감
이 페이지에서는 맵 필드를 사용하여 하위 필드 그룹의 색인 설정을 관리하는 방법을 설명합니다.
미사용 색인을 삭제하여 저장소 비용을 줄이고 쓰기 성능을 개선하는 것이 좋습니다. 기본적으로 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_id
및 timestamp
또는 team_id
및 timestamp
를 기반으로 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, timestamp
및details.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개로 줄입니다.
문서 데이터 모델에 미사용 단일 필드 색인이 있는 여러 필드가 포함된 경우 맵 필드와 하위 필드 접근 방식을 사용하는 것이 좋습니다. 특히 필드가 여러 개인 문서에는 이러한 접근 방식을 고려하는 것이 좋습니다.