This guide covers essential MongoDB query optimization techniques and best practices commonly asked in technical interviews. Each question includes detailed answers and practical examples.
Key factors affecting MongoDB query performance include:
MongoDB query optimization involves several strategies:
// Create appropriate indexes
db.users.createIndex({ email: 1 })
db.users.createIndex({ age: 1, status: 1 })
// Use compound indexes for common query patterns
db.users.createIndex({
status: 1,
age: 1,
createdAt: -1
})
// Use covered queries
db.users.find(
{ status: "active", age: { $gt: 25 } },
{ _id: 0, name: 1, email: 1 }
)
// Use projection to limit returned fields
db.users.find(
{ status: "active" },
{ name: 1, email: 1, _id: 0 }
)
// Use limit and skip efficiently
db.users.find({ status: "active" })
.sort({ createdAt: -1 })
.limit(10)
// Use aggregation for complex queries
db.users.aggregate([
{ $match: { status: "active" } },
{ $group: {
_id: "$age",
count: { $sum: 1 }
}},
{ $sort: { count: -1 } }
])
Query performance analysis and improvement involves:
// Analyze query execution plan
db.users.find({ status: "active" }).explain("executionStats")
// Check index usage
db.users.find({
status: "active",
age: { $gt: 25 }
}).explain("executionStats")
// Monitor slow queries
db.setProfilingLevel(1, { slowms: 100 })
// Check current operations
db.currentOp()
// Analyze index usage
db.users.aggregate([
{ $indexStats: {} }
])
Best practices for MongoDB query optimization include:
// Best practice: Use covered queries
db.users.find(
{ status: "active" },
{ _id: 0, name: 1, email: 1 }
)
// Best practice: Use compound indexes
db.users.createIndex({
status: 1,
age: 1,
createdAt: -1
})
// Best practice: Use aggregation for complex operations
db.users.aggregate([
{ $match: { status: "active" } },
{ $project: {
name: 1,
email: 1,
age: 1
}},
{ $sort: { age: 1 } },
{ $limit: 10 }
])
// Best practice: Use bulk operations
db.users.bulkWrite([
{
updateOne: {
filter: { status: "inactive" },
update: { $set: { status: "active" } }
}
}
])
Handling large datasets in MongoDB requires:
// Implement sharding
sh.shardCollection("mydb.users", { userId: 1 })
// Use time-based partitioning
db.users.createIndex({
createdAt: 1
}, {
expireAfterSeconds: 30*24*60*60 // 30 days
})
// Use pagination
db.users.find({ status: "active" })
.sort({ createdAt: -1 })
.skip(pageSize * (pageNumber - 1))
.limit(pageSize)
// Use cursor-based pagination
db.users.find({
status: "active",
createdAt: { $lt: lastDocument.createdAt }
})
.sort({ createdAt: -1 })
.limit(pageSize)
Continue your MongoDB interview preparation with: