Create and Query Multikey Indexes for Arrays in MongoDB
📖 Scenario: You are managing a MongoDB collection that stores information about books in a library. Each book document contains a title and an array of authors. You want to create an index on the authors array to speed up searches for books by author.
🎯 Goal: Build a MongoDB collection with book documents containing an array of authors. Create a multikey index on the authors field. Then write a query to find all books by a specific author.
📋 What You'll Learn
Create a collection called books with documents having title and authors fields
Insert three book documents with exact titles and authors arrays
Create a multikey index on the authors field
Write a query to find all books where authors array contains 'Jane Austen'
💡 Why This Matters
🌍 Real World
Libraries, bookstores, and content platforms often store multiple authors per book. Multikey indexes help quickly find books by any author.
💼 Career
Database developers and administrators use multikey indexes to optimize queries on array fields in MongoDB, improving application performance.
Progress0 / 4 steps
1
Create the books collection with three book documents
Insert three documents into the books collection with these exact fields and values: { title: 'Pride and Prejudice', authors: ['Jane Austen'] }, { title: 'Good Omens', authors: ['Neil Gaiman', 'Terry Pratchett'] }, and { title: 'The Hobbit', authors: ['J.R.R. Tolkien'] }.
MongoDB
Hint
Use db.books.insertMany() with an array of three objects, each having title and authors fields.
2
Create a multikey index on the authors field
Create an index on the authors field of the books collection using db.books.createIndex().
MongoDB
Hint
Use db.books.createIndex({ authors: 1 }) to create the multikey index.
3
Write a query to find books by 'Jane Austen'
Write a query using db.books.find() to find all documents where the authors array contains the string 'Jane Austen'.
MongoDB
Hint
Use db.books.find({ authors: 'Jane Austen' }) to find matching documents.
4
Add a projection to show only the title field in the query result
Modify the previous db.books.find() query to include a projection that returns only the title field and excludes the _id field.
MongoDB
Hint
Add a second argument to db.books.find() with { title: 1, _id: 0 } to project only the title.
Practice
(1/5)
1. What is the main purpose of a multikey index in MongoDB when applied to an array field?
easy
A. To index each element inside the array separately for faster queries
B. To store the entire array as a single indexed value
C. To prevent duplicate values inside the array
D. To convert arrays into strings before indexing
Solution
Step 1: Understand what a multikey index does
A multikey index indexes each element of an array field separately, allowing efficient queries on any element inside the array.
Step 2: Compare options with this behavior
Only To index each element inside the array separately for faster queries describes indexing each element separately. Other options describe incorrect behaviors.
Final Answer:
To index each element inside the array separately for faster queries -> Option A
Quick Check:
Multikey index = indexes array elements separately [OK]
Hint: Multikey indexes each array element, not the whole array [OK]
Common Mistakes:
Thinking multikey indexes the whole array as one value
Confusing multikey with unique constraints
Assuming arrays are converted to strings before indexing
2. Which of the following is the correct syntax to create a multikey index on the tags array field in a MongoDB collection named posts?
easy
A. db.posts.createIndex({ tags: [1] })
B. db.posts.createIndex({ tags: 1 })
C. db.posts.createIndex({ tags: 'multikey' })
D. db.posts.createIndex({ tags: { $each: 1 } })
Solution
Step 1: Recall MongoDB index creation syntax
To create an index on a field, use createIndex({ field: 1 }) for ascending order.
Step 2: Understand multikey index creation
MongoDB automatically creates a multikey index if the field is an array. No special keyword is needed.
Final Answer:
db.posts.createIndex({ tags: 1 }) -> Option B
Quick Check:
Index array field normally = multikey index [OK]
Hint: Just index the array field normally; MongoDB handles multikey [OK]
Common Mistakes:
Using special keywords like 'multikey' in index definition
Trying to pass array syntax in index keys
Misusing MongoDB operators inside createIndex
3. Given the collection products with documents like { _id: 1, categories: ["electronics", "gadgets"] }, what will be the result of the query db.products.find({ categories: "gadgets" }) if a multikey index exists on categories?
medium
A. [{ _id: 1, categories: ["electronics"] }]
B. [] (empty array)
C. Error: Cannot query array field
D. [{ _id: 1, categories: ["electronics", "gadgets"] }]
Solution
Step 1: Understand query on array field with multikey index
The query searches for documents where the array contains "gadgets". The multikey index allows fast lookup of such elements.
Step 2: Check the document matching the query
The document with _id 1 has "gadgets" in its categories array, so it matches and will be returned.
Final Answer:
[{ _id: 1, categories: ["electronics", "gadgets"] }] -> Option D
Quick Check:
Query array element with multikey index returns matching docs [OK]
Hint: Query matches docs with array containing the value [OK]
Common Mistakes:
Expecting empty result because array is indexed
Thinking query errors on array fields
Confusing partial array matches with exact matches
4. You created a multikey index on the tags array field, but your query db.articles.find({ tags: "news" }) is slow. What is a likely reason?
medium
A. The index was created on a different field, not tags
B. Multikey indexes do not support queries on array elements
C. You must use $elemMatch to query array fields
D. MongoDB does not index array fields automatically
Solution
Step 1: Check index field correctness
If the index is on a different field, queries on tags won't use the index, causing slowness.
Step 2: Verify multikey index behavior
Multikey indexes do support queries on array elements without special operators like $elemMatch.
Final Answer:
The index was created on a different field, not tags -> Option A
Quick Check:
Index on correct field = fast query [OK]
Hint: Ensure index is on the queried array field [OK]
Common Mistakes:
Believing multikey indexes don't support element queries
Thinking $elemMatch is always required
Assuming MongoDB indexes arrays automatically without createIndex
5. You have a collection users with documents containing an array field roles. You want to create a multikey index on roles but only for users who are active (active: true). Which is the correct way to create a partial multikey index for this?