📖 Scenario: You are building a simple app to track user comments on different posts. Each post has its own collection of comments stored in subcollections. You want to find all comments across all posts that contain a specific keyword.
🎯 Goal: Build a Firebase query that uses a collection group query to find all comments containing the word "great" in their text, regardless of which post they belong to.
📋 What You'll Learn
Create a Firestore collection called posts with at least two documents.
Each posts document should have a subcollection called comments with comment documents.
Create a variable called keyword set to the string "great".
Write a collection group query on comments to find all comments where the text field contains the keyword.
Store the query in a variable called query.
💡 Why This Matters
🌍 Real World
Collection group queries let you search across many subcollections with the same name, useful for apps with nested data like comments on posts or reviews on products.
💼 Career
Understanding collection group queries is important for building scalable, efficient Firestore apps that need to search data across multiple nested collections.
Progress0 / 4 steps
1
Set up Firestore data structure
Create a Firestore collection called posts with two documents having IDs post1 and post2. Each post document should have a subcollection called comments with two comment documents. The comments should have a text field with these exact values:
- For post1/comments: comment1 with text "This is great!", comment2 with text "Nice work" - For post2/comments: comment1 with text "Great job", comment2 with text "Needs improvement"
Firebase
Hint
Use firestore.collection('posts') to get the posts collection. Then use doc() and collection('comments') to add comments.
2
Create a keyword variable
Create a variable called keyword and set it to the string "great".
Firebase
Hint
Use const keyword = 'great'; to create the variable.
3
Write the collection group query
Write a collection group query on comments to find all documents where the text field contains the keyword. Store this query in a variable called query. Use firestore.collectionGroup('comments') and a where clause with array-contains or >= and <= operators to filter text containing the keyword.
Firebase
Hint
Use firestore.collectionGroup('comments') and chain two where clauses with >= and <= to filter text starting with the keyword.
4
Complete the query setup
Add a line to execute the query and store the results in a variable called results. Use await query.get() to fetch the documents.
Firebase
Hint
Use const results = await query.get(); to fetch the matching documents.
Practice
(1/5)
1. What is the main purpose of a collection group query in Firebase Firestore?
easy
A. To delete an entire collection at once
B. To search documents across all collections with the same name
C. To update multiple documents in a single collection
D. To create a new collection with grouped documents
Solution
Step 1: Understand collection group queries
Collection group queries allow searching across all collections that share the same collection name, regardless of their location in the database.
Step 2: Compare options
Only To search documents across all collections with the same name describes searching across all collections with the same name. Other options describe different operations not related to collection group queries.
Final Answer:
To search documents across all collections with the same name -> Option B
Quick Check:
Collection group query = search across same-named collections [OK]
Hint: Collection group queries search all collections named the same [OK]
Common Mistakes:
Thinking collection group queries update or delete documents
Confusing collection group queries with single collection queries
Assuming collection group queries create new collections
2. Which of the following is the correct syntax to create a collection group query for all collections named comments in Firestore?
easy
A. firebase.firestore().collection('comments').where('text', '==', 'hello')
B. firebase.firestore().collection('comments').get()
C. firebase.firestore().collectionGroup('comments').where('text', '==', 'hello')
D. firebase.firestore().collectionGroup('comments').get()
Solution
Step 1: Identify collection group query syntax
The method collectionGroup('collectionName') is used to query all collections with that name.
Step 2: Check options
firebase.firestore().collectionGroup('comments').get() correctly uses collectionGroup('comments') and calls get() to fetch documents. firebase.firestore().collection('comments').get() uses collection which only queries one collection. Options C and D add filters but the question asks for syntax to create the query, not filtering.
Final Answer:
firebase.firestore().collectionGroup('comments').get() -> Option D
Quick Check:
Use collectionGroup('name') for group queries [OK]
Hint: Use collectionGroup('name') to query all same-named collections [OK]
Common Mistakes:
Using collection() instead of collectionGroup() for group queries
Adding filters when only syntax for query creation is asked
Confusing collectionGroup with collectionGroupQuery
But Firestore returns an error asking to create an index. What is the best way to fix this?
medium
A. Create a composite index for the 'orders' collection group on the 'status' field
B. Change the query to use collection() instead of collectionGroup()
C. Remove the where clause to avoid indexing
D. Restart the Firestore service to clear the error
Solution
Step 1: Understand Firestore index requirements
Firestore requires indexes for queries with filters on collection groups to optimize performance.
Step 2: Fix the error by creating the required index
The error message usually provides a link to create the needed composite index on the 'status' field for the 'orders' collection group.
Final Answer:
Create a composite index for the 'orders' collection group on the 'status' field -> Option A
Quick Check:
Index needed for filtered collectionGroup queries [OK]
Hint: Create indexes when Firestore requests for collection group filters [OK]
Common Mistakes:
Ignoring the index error and expecting query to work
Switching to collection() which won't query all collections
Removing filters to avoid indexing, losing query purpose
5. You want to find all reviews documents across your Firestore database where the rating is greater than 4, but only for reviews inside products collections (not other reviews collections). Your data structure is:
Which approach correctly achieves this using collection group queries?
hard
A. Use collectionGroup('reviews') and add a filter on a field indicating parent collection is 'products'
B. Use collectionGroup('reviews').where('rating', '>', 4) without filtering parent collection
C. Use collection('products').doc(productId).collection('reviews').where('rating', '>', 4)
D. Use collection('reviews').where('rating', '>', 4) to get all reviews with rating > 4
Solution
Step 1: Understand collection group query scope
collectionGroup('reviews') queries all 'reviews' collections regardless of parent collection.
Step 2: Filter by parent collection
Since you want only reviews under 'products', you must add a filter or structure your data to identify the parent collection, such as a field indicating the parent type.
Step 3: Evaluate options
Use collectionGroup('reviews') and add a filter on a field indicating parent collection is 'products' uses collectionGroup with a filter on a field indicating the parent collection, which is correct. Use collectionGroup('reviews').where('rating', '>', 4) without filtering parent collection lacks filtering by parent. Use collection('products').doc(productId).collection('reviews').where('rating', '>', 4) queries only one product's reviews, not all products. Use collection('reviews').where('rating', '>', 4) to get all reviews with rating > 4 is invalid because 'reviews' is not a root collection.
Final Answer:
Use collectionGroup('reviews') and add a filter on a field indicating parent collection is 'products' -> Option A
Quick Check:
Filter collectionGroup by parent info to limit scope [OK]
Hint: Add parent info filter to collectionGroup queries to limit scope [OK]
Common Mistakes:
Assuming collectionGroup can filter by parent collection automatically
Querying only one product's reviews instead of all
Using collection() on a non-root collection name
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.