> database-mongodb
Expert rules for schema design, indexing, and performance in MongoDB. Use when designing MongoDB schemas, creating indexes, or optimizing NoSQL query performance. (triggers: **/*.ts, **/*.js, **/*.json, mongo, mongoose, objectid, schema, model)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/database-mongodb?format=md"MongoDB Best Practices
Priority: P0 (CRITICAL)
Guidelines
-
Schema Design:
- Embed vs Reference:
- Embed (1:Few): Addresses, Phone Numbers. Optimization: Read locality.
- Reference (1:Many/Infinity): Logs, Activity History. Optimization: Document size limits (16MB).
- Bucket Pattern: For time-series or high-cardinality "One-to-Many", bucket items into documents (e.g.,
DailyLog).
- Embed vs Reference:
-
Indexing:
- ESR Rule: Equality, Sort, Range. Order your index keys
(status, date, price)if you querystatus='A', sort bydate, filterprice > 10. - Text Search: Use
$textsearch instead of$regexfor keywords.$regexis slow (linear scan) unless anchored (^prefix). - Covered Queries: Project only indexed fields to avoid fetching the document (
PROJECTIONis key). - Explain Plan: Target
nReturned/keysExaminedratio of ~1. IfdocsExamined>>nReturned, index is inefficient.
- ESR Rule: Equality, Sort, Range. Order your index keys
-
Sharding (Horizontal Scale):
- Shard Key: Avoid monotonically increasing keys (e.g.,
Timestamp,ObjectId) for high-write workloads (creates "Hot Shards"). Use Hashed Sharding or high-cardinality natural keys.
- Shard Key: Avoid monotonically increasing keys (e.g.,
-
Performance:
- Avoid
skip(): Use_idor sort-key based pagination (bucket_id > last_id).skip(10000)scans 10000 docs. - Aggregation: Prefer Aggregation Framework (
$match,$group) over bringing data to client (JS).
- Avoid
-
Operations:
- Write Concern: Understand
w:1(Ack) vsw:majority(Safe). - Transactions: Use only when ACID across multiple documents is stricter than performance needs.
- Write Concern: Understand
Anti-Patterns
- Large Arrays: Don't let arrays grow unboundedly (
$pushwithout limit). - Client-Side Filtering: Don't fetch 1MB document to use 1KB of data.
- Deep Nesting: Avoid >4 levels of nesting (hard to query/update).
References
> related_skills --same-repo
> typescript-tooling
Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)
> typescript-security
Secure coding practices for TypeScript. Use when validating input, handling auth tokens, sanitizing data, or managing secrets and sensitive configuration. (triggers: **/*.ts, **/*.tsx, validate, sanitize, xss, injection, auth, password, secret, token)
> typescript-language
Modern TypeScript standards for type safety and maintainability. Use when working with types, interfaces, generics, enums, unions, or tsconfig settings. (triggers: **/*.ts, **/*.tsx, tsconfig.json, type, interface, generic, enum, union, intersection, readonly, const, namespace)
> typescript-best-practices
Idiomatic TypeScript patterns for clean, maintainable code. Use when writing or refactoring TypeScript classes, functions, modules, or async logic. (triggers: **/*.ts, **/*.tsx, class, function, module, import, export, async, promise)