📖 Scenario: You are building a simple app to store and retrieve information about books in a library. Each book has a title, author, and year of publication. You want to be able to quickly find books by author and year together.
🎯 Goal: Create a Firebase Firestore database structure and define a composite index that allows efficient queries filtering by author and year.
📋 What You'll Learn
Create a collection called books with documents containing fields title, author, and year
Add a configuration variable called indexConfig that defines a composite index on author and year
Write a query that uses the composite index to find books by a specific author and year
Complete the Firestore index configuration JSON with the correct collection and fields
💡 Why This Matters
🌍 Real World
Composite indexes in Firestore help apps quickly find data when filtering by multiple fields, like searching books by author and year.
💼 Career
Understanding composite indexes is important for database optimization roles and backend development using Firebase.
Progress0 / 4 steps
1
Create the books collection with sample documents
Create a collection called books and add three documents with these exact fields and values: { title: "The Great Gatsby", author: "F. Scott Fitzgerald", year: 1925 }, { title: "1984", author: "George Orwell", year: 1949 }, and { title: "To Kill a Mockingbird", author: "Harper Lee", year: 1960 }.
Firebase
Hint
Use an array of objects named books with the exact titles, authors, and years.
2
Define the composite index configuration
Create a variable called indexConfig that defines a composite index for the books collection on the fields author and year, both in ascending order.
Firebase
Hint
Use the exact variable name indexConfig and specify collectionGroup as "books" with fields author and year ascending.
3
Write a query using the composite index
Write a Firestore query called queryBooks that finds all books where author equals "George Orwell" and year equals 1949, using the books collection.
Firebase
Hint
Use firestore.collection("books") and chain two where filters for author and year.
4
Complete the Firestore index configuration JSON
Complete the Firestore index configuration JSON object called firestoreIndex that includes the collectionId as "books" and the fields array with author and year both set to ascending order. This JSON is used to deploy the composite index.
Firebase
Hint
Use the exact variable name firestoreIndex and include collectionId and fields with the correct field paths and order.
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
Step 1: Understand composite index purpose
Composite indexes allow Firebase to quickly search using more than one field at the same time.
Step 2: Compare options to purpose
Only To efficiently query data using multiple fields together matches this purpose; others describe unrelated features.
Final Answer:
To efficiently query data using multiple fields together -> Option D
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?
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
Step 1: Check JSON structure for composite index
Correct composite index JSON includes collectionGroup, queryScope, and fields with fieldPath and order.
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.
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
Step 1: Identify query filters and orderBy fields
The query filters on 'category' and orders by 'price' ascending and 'rating' descending.
Step 2: Determine composite index fields and order
Composite index must include 'category' (filter), then 'price' (asc), then 'rating' (desc) in that order.
Final Answer:
Index on fields: category (ASC), price (ASC), rating (DESC) -> Option C
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
Step 1: Analyze query filter and orderBy
The query filters on 'status' and orders by 'date' descending.
Step 2: Determine correct composite index order
Composite index must start with filter field 'status' (ASC by default), then 'date' (DESC) as orderBy.
Final Answer:
Create a composite index on fields: status (ASC), date (DESC) -> Option A
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
Step 1: Identify query filter and sort fields
The query filters on 'location' and 'type', and sorts by 'date' ascending.
Step 2: Determine composite index order
Composite index must list filter fields first in any order, then the sort field last with ascending order.
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.
Final Answer:
Index on fields: location (ASC), type (ASC), date (ASC) -> Option B
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 unknownstrongwhile earning +1 Grip toward your certificate.