Bird
Raised Fist0
Firebasecloud~5 mins

Composite index requirements in Firebase - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you query a database with multiple conditions, it needs a special setup called a composite index to find data fast. Without this, your queries can be slow or fail. Composite indexes tell the database how to organize data for these complex searches.
When you want to search a collection by more than one field at the same time, like filtering users by age and city.
When you use queries that combine sorting and filtering on different fields.
When your app shows lists that need to be ordered by multiple criteria.
When Firestore tells you a query needs an index to run.
When you want to improve the speed of complex queries in your Firebase app.
Config File - firestore.indexes.json
firestore.indexes.json
{
  "indexes": [
    {
      "collectionGroup": "users",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "age", "order": "ASCENDING" },
        { "fieldPath": "city", "order": "ASCENDING" }
      ]
    }
  ]
}

This file defines a composite index for the users collection. It tells Firestore to index documents by age and city in ascending order. This setup allows queries filtering or sorting by these fields together to run efficiently.

Commands
This command uploads and applies the composite index configuration to your Firebase project so Firestore can use it for queries.
Terminal
firebase deploy --only firestore:indexes
Expected OutputExpected
=== Deploying to project example-project === ✔ firestore: indexes deployed successfully ✔ Deploy complete!
→
--only firestore:indexes - Deploys only Firestore indexes without affecting other Firebase services.
This command lists all composite indexes currently configured in your Firebase project to verify your index is active.
Terminal
firebase firestore:indexes
Expected OutputExpected
Composite Indexes: - Collection Group: users Fields: - age (ASCENDING) - city (ASCENDING) State: READY
Deletes the composite index named users_age_city if you no longer need it or want to update it.
Terminal
firebase firestore:indexes:delete users_age_city
Expected OutputExpected
Are you sure you want to delete the index users_age_city? (y/N) y ✔ Index users_age_city deleted.
Key Concept

If you run queries filtering or sorting by multiple fields, you must create a composite index to make those queries work and run fast.

Common Mistakes
Trying to run a query with multiple filters without creating the required composite index.
Firestore will reject the query and show an error because it cannot find an index to support it.
Create the composite index in firestore.indexes.json and deploy it before running the query.
Not deploying the index file after adding or changing composite indexes.
Changes stay local and Firestore does not know about the new index, so queries still fail.
Run 'firebase deploy --only firestore:indexes' to apply index changes.
Defining composite indexes with incorrect field order or missing fields.
The index won't match the query pattern, causing errors or slow queries.
Match the index fields and their order exactly to the query's filters and sort order.
Summary
Define composite indexes in firestore.indexes.json to support queries with multiple filters or sorts.
Deploy indexes using 'firebase deploy --only firestore:indexes' to activate them in your project.
Use 'firebase firestore:indexes' to check index status and 'firebase firestore:indexes:delete' to remove unused indexes.

Practice

(1/5)
1. What is the main reason Firebase requires a composite index?
easy
A. To encrypt data for security
B. To store data in multiple locations
C. To backup data automatically
D. To efficiently query data using multiple fields together

Solution

  1. Step 1: Understand composite index purpose

    Composite indexes allow Firebase to quickly search using more than one field at the same time.
  2. Step 2: Compare options to purpose

    Only To efficiently query data using multiple fields together matches this purpose; others describe unrelated features.
  3. Final Answer:

    To efficiently query data using multiple fields together -> Option D
  4. Quick Check:

    Composite index = multi-field query speed [OK]
Hint: Composite indexes speed up queries with multiple fields [OK]
Common Mistakes:
  • Confusing composite indexes with data backup
  • Thinking composite indexes encrypt data
  • Believing composite indexes store data in multiple places
2. Which of the following is the correct way to define a composite index in Firebase JSON?
easy
A. "indexes": [{"collectionGroup": "users", "queryScope": "COLLECTION", "fields": [{"fieldPath": "age", "order": "ASCENDING"}, {"fieldPath": "name", "order": "DESCENDING"}]}]
B. "indexes": [{"collection": "users", "fields": ["age", "name"]}]
C. "indexes": [{"collectionGroup": "users", "fields": [{"fieldPath": "age"}, {"fieldPath": "name"}]}]
D. "indexes": [{"collectionGroup": "users", "queryScope": "COLLECTION", "fields": ["age", "name"]}]

Solution

  1. Step 1: Check JSON structure for composite index

    Correct composite index JSON includes collectionGroup, queryScope, and fields with fieldPath and order.
  2. Step 2: Validate each option

    Only "indexes": [{"collectionGroup": "users", "queryScope": "COLLECTION", "fields": [{"fieldPath": "age", "order": "ASCENDING"}, {"fieldPath": "name", "order": "DESCENDING"}]}] has all required keys and correct field definitions with order specified.
  3. Final Answer:

    "indexes": [{"collectionGroup": "users", "queryScope": "COLLECTION", "fields": [{"fieldPath": "age", "order": "ASCENDING"}, {"fieldPath": "name", "order": "DESCENDING"}]}] -> Option A
  4. Quick Check:

    Composite index JSON needs fields with order [OK]
Hint: Composite index JSON needs fields with order and collectionGroup [OK]
Common Mistakes:
  • Omitting order in fields
  • Using 'collection' instead of 'collectionGroup'
  • Listing fields as simple strings without objects
3. Given this query in Firebase: db.collection('products').where('category', '==', 'books').orderBy('price', 'asc').orderBy('rating', 'desc'), what composite index is required?
medium
A. Index on fields: category (DESC), price (ASC), rating (ASC)
B. Index on fields: price (ASC), rating (DESC)
C. Index on fields: category (ASC), price (ASC), rating (DESC)
D. No composite index needed

Solution

  1. Step 1: Identify query filters and orderBy fields

    The query filters on 'category' and orders by 'price' ascending and 'rating' descending.
  2. Step 2: Determine composite index fields and order

    Composite index must include 'category' (filter), then 'price' (asc), then 'rating' (desc) in that order.
  3. Final Answer:

    Index on fields: category (ASC), price (ASC), rating (DESC) -> Option C
  4. Quick Check:

    Filter + orderBy fields = composite index fields [OK]
Hint: Include all filter and orderBy fields with correct order [OK]
Common Mistakes:
  • Ignoring filter field in index
  • Wrong order or direction of fields
  • Assuming no index needed for multiple orderBy
4. You get an error saying a composite index is missing for this query: db.collection('orders').where('status', '==', 'shipped').orderBy('date', 'desc'). Which fix is correct?
medium
A. Create a composite index on fields: status (ASC), date (DESC)
B. Create a composite index on fields: date (DESC), status (ASC)
C. Create a single-field index on date only
D. No index needed; fix query syntax

Solution

  1. Step 1: Analyze query filter and orderBy

    The query filters on 'status' and orders by 'date' descending.
  2. Step 2: Determine correct composite index order

    Composite index must start with filter field 'status' (ASC by default), then 'date' (DESC) as orderBy.
  3. Final Answer:

    Create a composite index on fields: status (ASC), date (DESC) -> Option A
  4. Quick Check:

    Filter field first, then orderBy fields in index [OK]
Hint: Filter field first in index, then orderBy fields [OK]
Common Mistakes:
  • Reversing field order in index
  • Creating single-field index only
  • Ignoring error and changing query syntax
5. You want to query a collection 'events' filtering by 'location' and 'type', and sorting by 'date' ascending. Which composite index definition is correct?
hard
A. Index on fields: date (ASC), location (ASC), type (ASC)
B. Index on fields: location (ASC), type (ASC), date (ASC)
C. Index on fields: location (DESC), type (DESC), date (ASC)
D. No composite index needed if only filtering

Solution

  1. Step 1: Identify query filter and sort fields

    The query filters on 'location' and 'type', and sorts by 'date' ascending.
  2. Step 2: Determine composite index order

    Composite index must list filter fields first in any order, then the sort field last with ascending order.
  3. Step 3: Validate options

    Index on fields: location (ASC), type (ASC), date (ASC) matches filter fields first (location, type) then date ascending. Index on fields: date (ASC), location (ASC), type (ASC) starts with date, which is incorrect. Index on fields: location (DESC), type (DESC), date (ASC) uses descending for filters, which is wrong. No composite index needed if only filtering is incorrect because sorting requires composite index.
  4. Final Answer:

    Index on fields: location (ASC), type (ASC), date (ASC) -> Option B
  5. Quick Check:

    Filters first, then sort field in index [OK]
Hint: Filter fields first, then sort field ascending in index [OK]
Common Mistakes:
  • Placing sort field before filters in index
  • Using descending order for filter fields
  • Assuming no index needed when sorting
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard