mongodb-query-and-index-optimize
npx skills add https://github.com/romiluz13/mongodb-agent-skills --skill mongodb-query-and-index-optimize
Agent 安装分布
Skill 文档
MongoDB Query and Index Optimization
Query patterns and indexing strategies for MongoDB, maintained by MongoDB. Contains 46 rules across 5 categories, prioritized by impact. Includes MongoDB 8.0 features: bulkWrite command, $queryStats, Query Settings, and updateOne sort option. Indexes are the primary tool for query performanceâmost slow queries are missing an appropriate index.
When to Apply
Reference these guidelines when:
- Writing new MongoDB queries or aggregations
- Creating or reviewing indexes for collections
- Debugging slow queries (COLLSCAN, high execution time)
- Reviewing explain() output
- Seeing Performance Advisor suggestions
- Optimizing aggregation pipelines
- Implementing full-text search
- Adding geospatial queries
- Setting up TTL (time-to-live) for data expiration
- Analyzing index usage with $indexStats
- Profiling slow operations
Rule Categories by Priority
| Priority | Category | Impact | Prefix | Rules |
|---|---|---|---|---|
| 1 | Index Essentials | CRITICAL | index- |
9 |
| 2 | Specialized Indexes | HIGH | index- |
11 |
| 3 | Query Patterns | HIGH | query- |
10 |
| 4 | Aggregation Optimization | HIGH | agg- |
8 |
| 5 | Performance Diagnostics | MEDIUM | perf- |
8 |
Quick Reference
1. Index Essentials (CRITICAL) – 9 rules
index-compound-field-order– Equality first, sort second, range last (ESR rule)index-compound-multi-field– Use compound indexes for multi-field queriesindex-ensure-usage– Avoid COLLSCAN, verify with explain()index-remove-unused– Audit indexes with $indexStatsindex-high-cardinality-first– Put selective fields at index startindex-covered-queries– Include projected fields to avoid document fetchindex-prefix-principle– Compound indexes serve prefix queriesindex-creation-background– Build indexes without blocking operationsindex-size-considerations– Keep indexes in RAM for optimal performance
2. Specialized Indexes (HIGH) – 11 rules
index-unique– Enforce uniqueness for identifiers and constraintsindex-partial– Index subset of documents to reduce sizeindex-sparse– Skip documents missing the indexed fieldindex-ttl– Automatic document expiration for sessions/logsindex-text-search– Full-text search with stemming and relevanceindex-wildcard– Dynamic field indexing for polymorphic schemasindex-multikey– Array field indexing (one entry per element)index-geospatial– 2dsphere indexes for location queriesindex-hashed– Uniform distribution for equality lookups or shard keysindex-clustered– Ordered storage with clustered collectionsindex-hidden– Safely test index removals in production
3. Query Patterns (HIGH) – 10 rules
query-use-projection– Fetch only needed fieldsquery-avoid-ne-nin– Use $in instead of negation operatorsquery-or-index– All $or clauses must have indexes for index usagequery-anchored-regex– Start regex with ^ for index usagequery-batch-operations– Avoid N+1 patterns, use $in or $lookupquery-pagination– Use range-based pagination, not skipquery-exists-with-sparse– Understand $exists behavior with sparse indexesquery-sort-collation– Match sort order and collation to indexesquery-bulkwrite-command– MongoDB 8.0 cross-collection atomic batch operationsquery-updateone-sort– MongoDB 8.0 deterministic updates with sort option
4. Aggregation Optimization (HIGH) – 8 rules
agg-match-early– Filter with $match at pipeline startagg-project-early– Reduce document size with $projectagg-sort-limit– Combine $sort with $limit for top-Nagg-lookup-index– Ensure $lookup foreign field is indexedagg-graphlookup– Use $graphLookup for recursive graph traversalagg-avoid-large-unwind– Don’t $unwind massive arraysagg-allowdiskuse– Handle large aggregations exceeding 100MBagg-group-memory-limit– Control $group memory and spills
5. Performance Diagnostics (MEDIUM) – 8 rules
perf-explain-interpretation– Read explain() output like a properf-slow-query-log– Use profiler to find slow operationsperf-index-stats– Find unused indexes with $indexStatsperf-query-plan-cache– Understand and manage query plan cacheperf-use-hint– Force a known-good index when the optimizer errsperf-atlas-performance-advisor– Use Atlas suggestions for missing indexesperf-query-stats– MongoDB 8.0 workload-based query analysis with $queryStatsperf-query-settings– MongoDB 8.0 persistent index hints with setQuerySettings
Key Principle
“If there’s no index, it’s a collection scan.”
Every query without a supporting index scans the entire collection. A 10ms query on 10,000 documents becomes a 10-second query on 10 million documents.
ESR Rule (Equality-Sort-Range)
The most important rule for compound index field order:
// Query: status = "active" AND createdAt > lastWeek ORDER BY priority
// ESR: Equality (status) â Sort (priority) â Range (createdAt)
db.tasks.createIndex({ status: 1, priority: 1, createdAt: 1 })
| Position | Type | Example | Why |
|---|---|---|---|
| First | Equality | status: "active" |
Narrows to exact matches |
| Second | Sort | ORDER BY priority |
Avoids in-memory sort |
| Third | Range | createdAt > date |
Scans within sorted data |
How to Use
Read individual rule files for detailed explanations and code examples:
rules/index-compound-field-order.md
rules/perf-explain-interpretation.md
rules/_sections.md
Each rule file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- “When NOT to use” exceptions
- How to verify with explain()
- Performance impact and metrics
How These Rules Work
Recommendations with Verification
Every rule in this skill provides:
- A recommendation based on best practices
- A verification checklist of things that should be confirmed
- Commands to verify so you can check before implementing
- MCP integration for automatic verification when connected
Why Verification Matters
I analyze code patterns, but I can’t see your actual database without a connection. This means I might suggest:
- Creating an index that already exists
- Optimizing a query that’s already using an efficient index
- Adding a compound index when a prefix already covers the query
Always verify before implementing. Each rule includes verification commands.
MongoDB MCP Integration
For automatic verification, connect the MongoDB MCP Server:
Option 1: Connection String
{
"mcpServers": {
"mongodb": {
"command": "npx",
"args": ["-y", "mongodb-mcp-server", "--readOnly"],
"env": {
"MDB_MCP_CONNECTION_STRING": "mongodb+srv://user:pass@cluster.mongodb.net/mydb"
}
}
}
}
Option 2: Local MongoDB
{
"mcpServers": {
"mongodb": {
"command": "npx",
"args": ["-y", "mongodb-mcp-server", "--readOnly"],
"env": {
"MDB_MCP_CONNECTION_STRING": "mongodb://localhost:27017/mydb"
}
}
}
}
â ï¸ Security: Use --readOnly for safety. Remove only if you need write operations.
When connected, I can automatically:
- Check existing indexes via
mcp__mongodb__collection-indexes - Analyze query performance via
mcp__mongodb__explain - Verify data patterns via
mcp__mongodb__aggregate
â ï¸ Action Policy
I will NEVER execute write operations without your explicit approval.
| Operation Type | MCP Tools | Action |
|---|---|---|
| Read (Safe) | find, aggregate, explain, collection-indexes, $indexStats |
I may run automatically to verify |
| Write (Requires Approval) | create-index, drop-index, update-many, delete-many |
I will show the command and wait for your “yes” |
| Destructive (Requires Approval) | drop-collection, drop-database |
I will warn you and require explicit confirmation |
When I recommend creating an index or making changes:
- I’ll explain what I want to do and why
- I’ll show you the exact command
- I’ll wait for your approval before executing
- If you say “go ahead” or “yes”, only then will I run it
Your database, your decision. I’m here to advise, not to act unilaterally.
Working Together
If you’re not sure about a recommendation:
- Run the verification commands I provide
- Share the output with me
- I’ll adjust my recommendation based on your actual data
We’re a teamâlet’s get this right together.
Full Compiled Document
For the complete guide with all rules expanded: AGENTS.md