📖 Scenario: You are managing a large online bookstore database. To handle the growing number of book sales efficiently, you want to distribute the sales data across multiple servers based on the sale date. This technique is called range-based sharding.Range-based sharding splits data into chunks based on a range of shard key values. Here, the shard key will be the saleDate field.
🎯 Goal: Set up a MongoDB sharded collection called bookSales in the bookstore database. Configure range-based sharding on the saleDate field to distribute sales data by date ranges.
📋 What You'll Learn
Create the bookSales collection with sample sales documents.
Enable sharding on the bookstore database.
Shard the bookSales collection using saleDate as the shard key.
Split the data into at least two chunks based on saleDate ranges.
💡 Why This Matters
🌍 Real World
Range-based sharding helps large databases distribute data efficiently by ranges, improving query performance and scalability.
💼 Career
Database administrators and backend engineers use sharding to manage big data and ensure fast access in production systems.
Progress0 / 4 steps
1
Create the bookSales collection with sample data
In the bookstore database, create a collection called bookSales and insert these exact documents: { _id: 1, book: "MongoDB Basics", saleDate: ISODate("2023-01-15") }, { _id: 2, book: "Advanced MongoDB", saleDate: ISODate("2023-03-10") }, and { _id: 3, book: "MongoDB Performance", saleDate: ISODate("2023-06-05") }.
MongoDB
Hint
Use db.collection.insertMany() to add multiple documents at once.
2
Enable sharding on the bookstore database
Enable sharding on the bookstore database by running sh.enableSharding("bookstore").
MongoDB
Hint
Use the sh.enableSharding() command with the database name as a string.
3
Shard the bookSales collection on saleDate
Shard the bookSales collection in the bookstore database using saleDate as the shard key by running sh.shardCollection("bookstore.bookSales", { saleDate: 1 }).
MongoDB
Hint
Use sh.shardCollection() with the full namespace and shard key object.
4
Split the bookSales collection into chunks by saleDate
Create a split point at ISODate("2023-04-01") to divide the bookSales collection into two chunks by running sh.splitAt("bookstore.bookSales", { saleDate: ISODate("2023-04-01") }).
MongoDB
Hint
Use sh.splitAt() with the full namespace and the split key value.
Practice
(1/5)
1. What is the main idea behind range-based sharding in MongoDB?
easy
A. Data is randomly distributed across shards.
B. Data is split into ranges based on shard key values.
C. Data is duplicated on all shards for backup.
D. Data is stored only on a single shard.
Solution
Step 1: Understand range-based sharding concept
Range-based sharding divides data into continuous ranges based on shard key values.
Step 2: Compare with other options
Random distribution or duplication are not characteristics of range-based sharding.
Final Answer:
Data is split into ranges based on shard key values. -> Option B
Quick Check:
Range-based sharding = Data split by ranges [OK]
Hint: Remember: range-based means splitting by value ranges [OK]
Common Mistakes:
Confusing range-based with hash-based sharding
Thinking data is duplicated on all shards
Assuming data is randomly distributed
2. Which of the following is the correct way to enable range-based sharding on a collection in MongoDB?
easy
A. sh.shardRangeCollection("db.collection", { "field": 1 })
B. sh.enableRangeSharding("db.collection")
C. db.collection.shardRange({ "field": 1 })
D. sh.shardCollection("db.collection", { "field": 1 })
Solution
Step 1: Recall MongoDB sharding command
The correct command to shard a collection by a key is sh.shardCollection() with the shard key.
Step 2: Verify syntax correctness
sh.shardCollection("db.collection", { "field": 1 }) uses the correct syntax: sh.shardCollection("db.collection", { "field": 1 }). Other options are invalid commands.
Final Answer:
sh.shardCollection("db.collection", { "field": 1 }) -> Option D
Quick Check:
Use sh.shardCollection() to enable sharding [OK]
Hint: Use sh.shardCollection() with shard key object [OK]
Common Mistakes:
Using non-existent commands like sh.enableRangeSharding
Incorrect method names like shardRangeCollection
Passing wrong parameters or missing shard key
3. Given a collection sharded by the field age with ranges: { age: { $lt: 20 } }, { age: { $gte: 20, $lt: 40 } }, and { age: { $gte: 40 } }, which shard will store a document with { age: 35 }?
medium
A. Shard with range { age: { $gte: 20, $lt: 40 } }
B. Shard with range { age: { $lt: 20 } }
C. Shard with range { age: { $gte: 40 } }
D. Document will be stored on all shards
Solution
Step 1: Identify the correct range for age 35
Age 35 fits in the range where age is greater or equal to 20 and less than 40.
Step 2: Match the range to the shard
The shard with range { age: { $gte: 20, $lt: 40 } } will store the document.
Final Answer:
Shard with range { age: { $gte: 20, $lt: 40 } } -> Option A
Quick Check:
35 is between 20 and 40, so goes to that shard [OK]
Hint: Match value to shard range boundaries carefully [OK]
Common Mistakes:
Choosing the shard with $lt: 20 incorrectly
Assuming document is stored on all shards
Confusing range boundaries (gte vs lt)
4. You have a range-based sharded collection on score with ranges: { score: { $lt: 50 } } and { score: { $gte: 50 } }. You try to insert { score: "high" } but get an error. What is the likely cause?
medium
A. The shard key ranges overlap causing conflict.
B. The shard key field is missing in the document.
C. The shard key value type does not match the defined range type.
D. MongoDB does not support string values in shard keys.
Solution
Step 1: Understand shard key type requirements
Shard key values must match the type used in range definitions. Here, ranges expect numeric scores.
Step 2: Identify the error cause
Inserting a string "high" for a numeric shard key causes a type mismatch error.
Final Answer:
The shard key value type does not match the defined range type. -> Option C
Quick Check:
Shard key types must match range types [OK]
Hint: Shard key values must match range data types [OK]
Common Mistakes:
Assuming missing shard key field causes this error
Thinking overlapping ranges cause insert errors
Believing MongoDB disallows strings in shard keys
5. You want to shard a large user collection by signupDate using range-based sharding. Which shard key choice will best support queries filtering users by recent signup dates?
hard
A. Use { signupDate: 1 } as shard key to split by date ranges.
B. Use { userId: 1 } as shard key for even data distribution.
C. Use { signupDate: "hashed" } to hash dates for randomness.
D. Use { lastLogin: 1 } as shard key for login-based queries.
Solution
Step 1: Identify query pattern
Queries filter users by recent signup dates, so shard key should support range queries on signupDate.
Step 2: Choose shard key matching query pattern
Using { signupDate: 1 } enables range-based sharding by date, optimizing these queries.
Step 3: Evaluate other options
Hashing or using unrelated fields won't support efficient range queries on signupDate.
Final Answer:
Use { signupDate: 1 } as shard key to split by date ranges. -> Option A
Quick Check:
Shard key matches query field for best performance [OK]
Hint: Match shard key to common query field for range queries [OK]
Common Mistakes:
Choosing hashed shard key when range queries are needed
Picking unrelated fields like userId or lastLogin
Ignoring query patterns when selecting shard key
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.