@mytechtoday/augment-extensions 0.1.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,856 @@
|
|
|
1
|
+
# NoSQL Document Stores
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers document store databases (MongoDB, CouchDB, Couchbase), including schema design patterns (embedding vs referencing), denormalization strategies, indexing, aggregation pipelines, transactions, sharding, replication, and query optimization.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Document Store Fundamentals
|
|
10
|
+
|
|
11
|
+
### What is a Document Store?
|
|
12
|
+
|
|
13
|
+
**Definition**: Database that stores data as documents (typically JSON/BSON)
|
|
14
|
+
|
|
15
|
+
**Characteristics:**
|
|
16
|
+
- Documents are self-contained units of data
|
|
17
|
+
- Flexible schema (each document can have different fields)
|
|
18
|
+
- Nested data structures (arrays, objects)
|
|
19
|
+
- Rich query capabilities
|
|
20
|
+
- Horizontal scalability
|
|
21
|
+
|
|
22
|
+
**Document Example:**
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"_id": "507f1f77bcf86cd799439011",
|
|
26
|
+
"name": "John Doe",
|
|
27
|
+
"email": "john@example.com",
|
|
28
|
+
"age": 30,
|
|
29
|
+
"addresses": [
|
|
30
|
+
{
|
|
31
|
+
"type": "home",
|
|
32
|
+
"street": "123 Main St",
|
|
33
|
+
"city": "Boston",
|
|
34
|
+
"state": "MA",
|
|
35
|
+
"zip": "02101"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"preferences": {
|
|
39
|
+
"newsletter": true,
|
|
40
|
+
"notifications": {
|
|
41
|
+
"email": true,
|
|
42
|
+
"sms": false
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"created_at": "2024-01-15T10:00:00Z",
|
|
46
|
+
"updated_at": "2024-01-15T10:00:00Z"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Popular Document Databases
|
|
51
|
+
|
|
52
|
+
**MongoDB:**
|
|
53
|
+
- Most popular document database
|
|
54
|
+
- BSON (Binary JSON) format
|
|
55
|
+
- Rich query language
|
|
56
|
+
- Aggregation framework
|
|
57
|
+
- Sharding and replication
|
|
58
|
+
- ACID transactions (4.0+)
|
|
59
|
+
|
|
60
|
+
**CouchDB:**
|
|
61
|
+
- HTTP/REST API
|
|
62
|
+
- Multi-version concurrency control (MVCC)
|
|
63
|
+
- Eventual consistency
|
|
64
|
+
- Master-master replication
|
|
65
|
+
- MapReduce views
|
|
66
|
+
|
|
67
|
+
**Couchbase:**
|
|
68
|
+
- Combines document store with key-value store
|
|
69
|
+
- N1QL query language (SQL-like)
|
|
70
|
+
- Built-in caching
|
|
71
|
+
- High performance
|
|
72
|
+
- Mobile sync (Couchbase Lite)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Schema Design Patterns
|
|
77
|
+
|
|
78
|
+
### Embedding vs Referencing
|
|
79
|
+
|
|
80
|
+
**Key Decision**: Should related data be embedded or referenced?
|
|
81
|
+
|
|
82
|
+
#### Embedding (Denormalization)
|
|
83
|
+
|
|
84
|
+
**Store related data within the same document:**
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
// User with embedded addresses
|
|
88
|
+
{
|
|
89
|
+
"_id": "user123",
|
|
90
|
+
"name": "John Doe",
|
|
91
|
+
"email": "john@example.com",
|
|
92
|
+
"addresses": [
|
|
93
|
+
{ "type": "home", "street": "123 Main St", "city": "Boston" },
|
|
94
|
+
{ "type": "work", "street": "456 Office Blvd", "city": "Cambridge" }
|
|
95
|
+
],
|
|
96
|
+
"payment_methods": [
|
|
97
|
+
{ "type": "credit_card", "last4": "1234", "brand": "Visa" },
|
|
98
|
+
{ "type": "paypal", "email": "john@paypal.com" }
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Advantages:**
|
|
104
|
+
- ✅ Single query to retrieve all data
|
|
105
|
+
- ✅ Better read performance
|
|
106
|
+
- ✅ Atomic updates (single document)
|
|
107
|
+
- ✅ Data locality (related data stored together)
|
|
108
|
+
|
|
109
|
+
**Disadvantages:**
|
|
110
|
+
- ❌ Data duplication
|
|
111
|
+
- ❌ Document size limits (16MB in MongoDB)
|
|
112
|
+
- ❌ Difficult to query embedded data across documents
|
|
113
|
+
- ❌ Update complexity if data is duplicated
|
|
114
|
+
|
|
115
|
+
**When to embed:**
|
|
116
|
+
- ✅ One-to-few relationships (< 100 items)
|
|
117
|
+
- ✅ Data is always accessed together
|
|
118
|
+
- ✅ Data doesn't change frequently
|
|
119
|
+
- ✅ Embedded data is specific to parent document
|
|
120
|
+
|
|
121
|
+
#### Referencing (Normalization)
|
|
122
|
+
|
|
123
|
+
**Store references (IDs) to related data:**
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// User document
|
|
127
|
+
{
|
|
128
|
+
"_id": "user123",
|
|
129
|
+
"name": "John Doe",
|
|
130
|
+
"email": "john@example.com"
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Address documents (separate collection)
|
|
134
|
+
{
|
|
135
|
+
"_id": "addr456",
|
|
136
|
+
"user_id": "user123",
|
|
137
|
+
"type": "home",
|
|
138
|
+
"street": "123 Main St",
|
|
139
|
+
"city": "Boston"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
{
|
|
143
|
+
"_id": "addr789",
|
|
144
|
+
"user_id": "user123",
|
|
145
|
+
"type": "work",
|
|
146
|
+
"street": "456 Office Blvd",
|
|
147
|
+
"city": "Cambridge"
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Advantages:**
|
|
152
|
+
- ✅ No data duplication
|
|
153
|
+
- ✅ Smaller document size
|
|
154
|
+
- ✅ Easier to query related data independently
|
|
155
|
+
- ✅ Easier to update (single location)
|
|
156
|
+
|
|
157
|
+
**Disadvantages:**
|
|
158
|
+
- ❌ Multiple queries required (application-level joins)
|
|
159
|
+
- ❌ Slower read performance
|
|
160
|
+
- ❌ No atomic updates across documents (without transactions)
|
|
161
|
+
|
|
162
|
+
**When to reference:**
|
|
163
|
+
- ✅ One-to-many or many-to-many relationships
|
|
164
|
+
- ✅ Data is accessed independently
|
|
165
|
+
- ✅ Data changes frequently
|
|
166
|
+
- ✅ Embedded data would exceed document size limits
|
|
167
|
+
- ✅ Data is shared across multiple documents
|
|
168
|
+
|
|
169
|
+
### Hybrid Approach
|
|
170
|
+
|
|
171
|
+
**Combine embedding and referencing:**
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
// Blog post with embedded author summary + reference
|
|
175
|
+
{
|
|
176
|
+
"_id": "post123",
|
|
177
|
+
"title": "Introduction to NoSQL",
|
|
178
|
+
"content": "...",
|
|
179
|
+
"author": {
|
|
180
|
+
"id": "user456", // Reference to full user document
|
|
181
|
+
"name": "John Doe", // Embedded for display
|
|
182
|
+
"avatar_url": "..." // Embedded for display
|
|
183
|
+
},
|
|
184
|
+
"comments": [
|
|
185
|
+
{
|
|
186
|
+
"id": "comment789",
|
|
187
|
+
"author": {
|
|
188
|
+
"id": "user789",
|
|
189
|
+
"name": "Jane Smith"
|
|
190
|
+
},
|
|
191
|
+
"text": "Great article!",
|
|
192
|
+
"created_at": "2024-01-15T11:00:00Z"
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
"tags": ["nosql", "mongodb", "databases"], // Embedded (small, static)
|
|
196
|
+
"category_id": "cat123", // Reference (shared across posts)
|
|
197
|
+
"created_at": "2024-01-15T10:00:00Z"
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Benefits:**
|
|
202
|
+
- ✅ Fast reads (embedded display data)
|
|
203
|
+
- ✅ Consistent updates (reference to source of truth)
|
|
204
|
+
- ✅ Flexible querying
|
|
205
|
+
|
|
206
|
+
### One-to-Many Relationships
|
|
207
|
+
|
|
208
|
+
**Pattern 1: Embed child in parent (one-to-few)**
|
|
209
|
+
```javascript
|
|
210
|
+
// Order with embedded line items
|
|
211
|
+
{
|
|
212
|
+
"_id": "order123",
|
|
213
|
+
"customer_id": "user456",
|
|
214
|
+
"items": [
|
|
215
|
+
{ "product_id": "prod789", "name": "Widget", "quantity": 2, "price": 10.00 },
|
|
216
|
+
{ "product_id": "prod012", "name": "Gadget", "quantity": 1, "price": 25.00 }
|
|
217
|
+
],
|
|
218
|
+
"total": 45.00,
|
|
219
|
+
"status": "shipped"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Pattern 2: Reference parent in child (one-to-many)**
|
|
224
|
+
```javascript
|
|
225
|
+
// User document
|
|
226
|
+
{ "_id": "user456", "name": "John Doe" }
|
|
227
|
+
|
|
228
|
+
// Order documents (many)
|
|
229
|
+
{ "_id": "order123", "user_id": "user456", "total": 45.00 }
|
|
230
|
+
{ "_id": "order124", "user_id": "user456", "total": 99.99 }
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Pattern 3: Reference children in parent (one-to-many)**
|
|
234
|
+
```javascript
|
|
235
|
+
// User with order references
|
|
236
|
+
{
|
|
237
|
+
"_id": "user456",
|
|
238
|
+
"name": "John Doe",
|
|
239
|
+
"order_ids": ["order123", "order124", "order125"]
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Order documents
|
|
243
|
+
{ "_id": "order123", "total": 45.00 }
|
|
244
|
+
{ "_id": "order124", "total": 99.99 }
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Many-to-Many Relationships
|
|
248
|
+
|
|
249
|
+
**Pattern 1: Embed array of references**
|
|
250
|
+
```javascript
|
|
251
|
+
// Product with category references
|
|
252
|
+
{
|
|
253
|
+
"_id": "prod123",
|
|
254
|
+
"name": "Laptop",
|
|
255
|
+
"category_ids": ["cat_electronics", "cat_computers", "cat_office"]
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Category with product references
|
|
259
|
+
{
|
|
260
|
+
"_id": "cat_electronics",
|
|
261
|
+
"name": "Electronics",
|
|
262
|
+
"product_ids": ["prod123", "prod456", "prod789"]
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Pattern 2: Junction collection**
|
|
267
|
+
```javascript
|
|
268
|
+
// Product document
|
|
269
|
+
{ "_id": "prod123", "name": "Laptop" }
|
|
270
|
+
|
|
271
|
+
// Category document
|
|
272
|
+
{ "_id": "cat_electronics", "name": "Electronics" }
|
|
273
|
+
|
|
274
|
+
// ProductCategory junction
|
|
275
|
+
{
|
|
276
|
+
"_id": "pc123",
|
|
277
|
+
"product_id": "prod123",
|
|
278
|
+
"category_id": "cat_electronics",
|
|
279
|
+
"featured": true,
|
|
280
|
+
"sort_order": 1
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Indexing
|
|
287
|
+
|
|
288
|
+
### Index Types
|
|
289
|
+
|
|
290
|
+
**Single Field Index:**
|
|
291
|
+
```javascript
|
|
292
|
+
// Create index on email field
|
|
293
|
+
db.users.createIndex({ email: 1 }); // 1 = ascending, -1 = descending
|
|
294
|
+
|
|
295
|
+
// Query uses index
|
|
296
|
+
db.users.find({ email: "john@example.com" });
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Compound Index:**
|
|
300
|
+
```javascript
|
|
301
|
+
// Create compound index
|
|
302
|
+
db.orders.createIndex({ user_id: 1, created_at: -1 });
|
|
303
|
+
|
|
304
|
+
// Queries that use this index
|
|
305
|
+
db.orders.find({ user_id: "user123" }).sort({ created_at: -1 });
|
|
306
|
+
db.orders.find({ user_id: "user123", created_at: { $gte: new Date("2024-01-01") } });
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Multikey Index (Arrays):**
|
|
310
|
+
```javascript
|
|
311
|
+
// Create index on array field
|
|
312
|
+
db.products.createIndex({ tags: 1 });
|
|
313
|
+
|
|
314
|
+
// Query uses index
|
|
315
|
+
db.products.find({ tags: "electronics" });
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Text Index (Full-Text Search):**
|
|
319
|
+
```javascript
|
|
320
|
+
// Create text index
|
|
321
|
+
db.articles.createIndex({ title: "text", content: "text" });
|
|
322
|
+
|
|
323
|
+
// Full-text search
|
|
324
|
+
db.articles.find({ $text: { $search: "mongodb tutorial" } });
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Geospatial Index:**
|
|
328
|
+
```javascript
|
|
329
|
+
// Create 2dsphere index for location data
|
|
330
|
+
db.places.createIndex({ location: "2dsphere" });
|
|
331
|
+
|
|
332
|
+
// Find places near coordinates
|
|
333
|
+
db.places.find({
|
|
334
|
+
location: {
|
|
335
|
+
$near: {
|
|
336
|
+
$geometry: { type: "Point", coordinates: [-73.97, 40.77] },
|
|
337
|
+
$maxDistance: 5000 // meters
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**Unique Index:**
|
|
344
|
+
```javascript
|
|
345
|
+
// Create unique index
|
|
346
|
+
db.users.createIndex({ email: 1 }, { unique: true });
|
|
347
|
+
|
|
348
|
+
// Duplicate emails will be rejected
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Partial Index:**
|
|
352
|
+
```javascript
|
|
353
|
+
// Index only documents matching filter
|
|
354
|
+
db.orders.createIndex(
|
|
355
|
+
{ user_id: 1, created_at: -1 },
|
|
356
|
+
{ partialFilterExpression: { status: "active" } }
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
// Only indexes active orders
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**TTL Index (Time-To-Live):**
|
|
363
|
+
```javascript
|
|
364
|
+
// Auto-delete documents after expiration
|
|
365
|
+
db.sessions.createIndex(
|
|
366
|
+
{ created_at: 1 },
|
|
367
|
+
{ expireAfterSeconds: 3600 } // Delete after 1 hour
|
|
368
|
+
);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Index Best Practices
|
|
372
|
+
|
|
373
|
+
**DO:**
|
|
374
|
+
- ✅ Create indexes for frequently queried fields
|
|
375
|
+
- ✅ Use compound indexes for multi-field queries
|
|
376
|
+
- ✅ Create indexes before querying large collections
|
|
377
|
+
- ✅ Use covered queries (query only indexed fields)
|
|
378
|
+
- ✅ Monitor index usage with explain()
|
|
379
|
+
- ✅ Remove unused indexes
|
|
380
|
+
|
|
381
|
+
**DON'T:**
|
|
382
|
+
- ❌ Create too many indexes (slows writes)
|
|
383
|
+
- ❌ Index low-cardinality fields (few unique values)
|
|
384
|
+
- ❌ Forget to index foreign keys
|
|
385
|
+
- ❌ Create redundant indexes
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Aggregation Pipelines
|
|
390
|
+
|
|
391
|
+
### What is Aggregation?
|
|
392
|
+
|
|
393
|
+
**Definition**: Process documents through a pipeline of stages to compute results
|
|
394
|
+
|
|
395
|
+
**Common stages:**
|
|
396
|
+
- `$match`: Filter documents
|
|
397
|
+
- `$group`: Group by field and compute aggregates
|
|
398
|
+
- `$project`: Select/transform fields
|
|
399
|
+
- `$sort`: Sort documents
|
|
400
|
+
- `$limit`: Limit number of documents
|
|
401
|
+
- `$skip`: Skip documents
|
|
402
|
+
- `$lookup`: Join with another collection
|
|
403
|
+
- `$unwind`: Deconstruct array field
|
|
404
|
+
|
|
405
|
+
### Aggregation Examples
|
|
406
|
+
|
|
407
|
+
**Example 1: Group and count**
|
|
408
|
+
```javascript
|
|
409
|
+
// Count orders by status
|
|
410
|
+
db.orders.aggregate([
|
|
411
|
+
{ $group: { _id: "$status", count: { $sum: 1 } } },
|
|
412
|
+
{ $sort: { count: -1 } }
|
|
413
|
+
]);
|
|
414
|
+
|
|
415
|
+
// Result:
|
|
416
|
+
// [
|
|
417
|
+
// { "_id": "shipped", "count": 150 },
|
|
418
|
+
// { "_id": "pending", "count": 45 },
|
|
419
|
+
// { "_id": "cancelled", "count": 5 }
|
|
420
|
+
// ]
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Example 2: Filter, group, and calculate**
|
|
424
|
+
```javascript
|
|
425
|
+
// Total revenue by user for orders in 2024
|
|
426
|
+
db.orders.aggregate([
|
|
427
|
+
{ $match: { created_at: { $gte: new Date("2024-01-01") } } },
|
|
428
|
+
{ $group: {
|
|
429
|
+
_id: "$user_id",
|
|
430
|
+
total_revenue: { $sum: "$total" },
|
|
431
|
+
order_count: { $sum: 1 },
|
|
432
|
+
avg_order: { $avg: "$total" }
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
{ $sort: { total_revenue: -1 } },
|
|
436
|
+
{ $limit: 10 }
|
|
437
|
+
]);
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Example 3: Unwind array and group**
|
|
441
|
+
```javascript
|
|
442
|
+
// Count products by tag
|
|
443
|
+
db.products.aggregate([
|
|
444
|
+
{ $unwind: "$tags" },
|
|
445
|
+
{ $group: { _id: "$tags", count: { $sum: 1 } } },
|
|
446
|
+
{ $sort: { count: -1 } }
|
|
447
|
+
]);
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**Example 4: Lookup (join)**
|
|
451
|
+
```javascript
|
|
452
|
+
// Join orders with user data
|
|
453
|
+
db.orders.aggregate([
|
|
454
|
+
{ $lookup: {
|
|
455
|
+
from: "users",
|
|
456
|
+
localField: "user_id",
|
|
457
|
+
foreignField: "_id",
|
|
458
|
+
as: "user"
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
{ $unwind: "$user" },
|
|
462
|
+
{ $project: {
|
|
463
|
+
order_id: "$_id",
|
|
464
|
+
total: 1,
|
|
465
|
+
user_name: "$user.name",
|
|
466
|
+
user_email: "$user.email"
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
]);
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
**Example 5: Complex aggregation with multiple stages**
|
|
473
|
+
```javascript
|
|
474
|
+
// Top 5 customers by revenue with order details
|
|
475
|
+
db.orders.aggregate([
|
|
476
|
+
{ $match: { status: "completed" } },
|
|
477
|
+
{ $group: {
|
|
478
|
+
_id: "$user_id",
|
|
479
|
+
total_spent: { $sum: "$total" },
|
|
480
|
+
order_count: { $sum: 1 },
|
|
481
|
+
orders: { $push: { order_id: "$_id", total: "$total", date: "$created_at" } }
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
{ $lookup: {
|
|
485
|
+
from: "users",
|
|
486
|
+
localField: "_id",
|
|
487
|
+
foreignField: "_id",
|
|
488
|
+
as: "user"
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
{ $unwind: "$user" },
|
|
492
|
+
{ $project: {
|
|
493
|
+
user_name: "$user.name",
|
|
494
|
+
user_email: "$user.email",
|
|
495
|
+
total_spent: 1,
|
|
496
|
+
order_count: 1,
|
|
497
|
+
avg_order: { $divide: ["$total_spent", "$order_count"] },
|
|
498
|
+
orders: 1
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
{ $sort: { total_spent: -1 } },
|
|
502
|
+
{ $limit: 5 }
|
|
503
|
+
]);
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## Transactions
|
|
509
|
+
|
|
510
|
+
### Multi-Document Transactions (MongoDB 4.0+)
|
|
511
|
+
|
|
512
|
+
**ACID transactions across multiple documents:**
|
|
513
|
+
|
|
514
|
+
```javascript
|
|
515
|
+
const session = client.startSession();
|
|
516
|
+
|
|
517
|
+
try {
|
|
518
|
+
await session.withTransaction(async () => {
|
|
519
|
+
// Deduct from sender
|
|
520
|
+
await db.accounts.updateOne(
|
|
521
|
+
{ _id: senderId },
|
|
522
|
+
{ $inc: { balance: -amount } },
|
|
523
|
+
{ session }
|
|
524
|
+
);
|
|
525
|
+
|
|
526
|
+
// Add to receiver
|
|
527
|
+
await db.accounts.updateOne(
|
|
528
|
+
{ _id: receiverId },
|
|
529
|
+
{ $inc: { balance: amount } },
|
|
530
|
+
{ session }
|
|
531
|
+
);
|
|
532
|
+
|
|
533
|
+
// Log transaction
|
|
534
|
+
await db.transactions.insertOne({
|
|
535
|
+
from: senderId,
|
|
536
|
+
to: receiverId,
|
|
537
|
+
amount: amount,
|
|
538
|
+
timestamp: new Date()
|
|
539
|
+
}, { session });
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
console.log("Transaction committed");
|
|
543
|
+
} catch (error) {
|
|
544
|
+
console.log("Transaction aborted:", error);
|
|
545
|
+
} finally {
|
|
546
|
+
await session.endSession();
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Single-Document Atomicity
|
|
551
|
+
|
|
552
|
+
**All updates to a single document are atomic:**
|
|
553
|
+
|
|
554
|
+
```javascript
|
|
555
|
+
// Atomic update - all fields updated together
|
|
556
|
+
db.orders.updateOne(
|
|
557
|
+
{ _id: orderId },
|
|
558
|
+
{
|
|
559
|
+
$set: { status: "shipped", shipped_at: new Date() },
|
|
560
|
+
$inc: { version: 1 },
|
|
561
|
+
$push: { status_history: { status: "shipped", timestamp: new Date() } }
|
|
562
|
+
}
|
|
563
|
+
);
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### Optimistic Concurrency Control
|
|
567
|
+
|
|
568
|
+
**Use version field to prevent conflicts:**
|
|
569
|
+
|
|
570
|
+
```javascript
|
|
571
|
+
// Read document with version
|
|
572
|
+
const product = await db.products.findOne({ _id: productId });
|
|
573
|
+
const currentVersion = product.version;
|
|
574
|
+
|
|
575
|
+
// Update with version check
|
|
576
|
+
const result = await db.products.updateOne(
|
|
577
|
+
{ _id: productId, version: currentVersion },
|
|
578
|
+
{
|
|
579
|
+
$set: { stock: product.stock - quantity },
|
|
580
|
+
$inc: { version: 1 }
|
|
581
|
+
}
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
if (result.modifiedCount === 0) {
|
|
585
|
+
throw new Error("Concurrent modification detected - retry");
|
|
586
|
+
}
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Sharding
|
|
592
|
+
|
|
593
|
+
### What is Sharding?
|
|
594
|
+
|
|
595
|
+
**Definition**: Horizontal partitioning of data across multiple servers
|
|
596
|
+
|
|
597
|
+
**Benefits:**
|
|
598
|
+
- ✅ Horizontal scalability
|
|
599
|
+
- ✅ Distribute load across servers
|
|
600
|
+
- ✅ Store more data than single server can handle
|
|
601
|
+
|
|
602
|
+
**Shard Key**: Field used to partition data
|
|
603
|
+
|
|
604
|
+
### Choosing a Shard Key
|
|
605
|
+
|
|
606
|
+
**Good shard keys:**
|
|
607
|
+
- ✅ High cardinality (many unique values)
|
|
608
|
+
- ✅ Even distribution of data
|
|
609
|
+
- ✅ Supports common query patterns
|
|
610
|
+
- ✅ Rarely updated
|
|
611
|
+
|
|
612
|
+
**Bad shard keys:**
|
|
613
|
+
- ❌ Low cardinality (few unique values)
|
|
614
|
+
- ❌ Monotonically increasing (e.g., auto-increment ID, timestamp)
|
|
615
|
+
- ❌ Frequently updated
|
|
616
|
+
|
|
617
|
+
**Example: Shard by user_id**
|
|
618
|
+
```javascript
|
|
619
|
+
// Enable sharding on database
|
|
620
|
+
sh.enableSharding("myapp");
|
|
621
|
+
|
|
622
|
+
// Shard collection by user_id
|
|
623
|
+
sh.shardCollection("myapp.orders", { user_id: 1 });
|
|
624
|
+
|
|
625
|
+
// Queries with user_id are routed to specific shard
|
|
626
|
+
db.orders.find({ user_id: "user123" }); // Targeted query
|
|
627
|
+
|
|
628
|
+
// Queries without user_id scan all shards
|
|
629
|
+
db.orders.find({ status: "pending" }); // Scatter-gather query
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
**Example: Compound shard key**
|
|
633
|
+
```javascript
|
|
634
|
+
// Shard by user_id and created_at
|
|
635
|
+
sh.shardCollection("myapp.events", { user_id: 1, created_at: 1 });
|
|
636
|
+
|
|
637
|
+
// Better distribution for time-series data
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
## Replication
|
|
643
|
+
|
|
644
|
+
### What is Replication?
|
|
645
|
+
|
|
646
|
+
**Definition**: Maintain multiple copies of data across servers
|
|
647
|
+
|
|
648
|
+
**Benefits:**
|
|
649
|
+
- ✅ High availability (failover)
|
|
650
|
+
- ✅ Data redundancy
|
|
651
|
+
- ✅ Read scalability (read from replicas)
|
|
652
|
+
- ✅ Disaster recovery
|
|
653
|
+
|
|
654
|
+
### MongoDB Replica Set
|
|
655
|
+
|
|
656
|
+
**Architecture:**
|
|
657
|
+
- **Primary**: Accepts writes
|
|
658
|
+
- **Secondary**: Replicates from primary
|
|
659
|
+
- **Arbiter**: Participates in elections (no data)
|
|
660
|
+
|
|
661
|
+
**Example: Configure replica set**
|
|
662
|
+
```javascript
|
|
663
|
+
// Initialize replica set
|
|
664
|
+
rs.initiate({
|
|
665
|
+
_id: "myReplicaSet",
|
|
666
|
+
members: [
|
|
667
|
+
{ _id: 0, host: "mongo1:27017" },
|
|
668
|
+
{ _id: 1, host: "mongo2:27017" },
|
|
669
|
+
{ _id: 2, host: "mongo3:27017" }
|
|
670
|
+
]
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
// Check status
|
|
674
|
+
rs.status();
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
**Read Preferences:**
|
|
678
|
+
```javascript
|
|
679
|
+
// Read from primary (default)
|
|
680
|
+
db.users.find().readPref("primary");
|
|
681
|
+
|
|
682
|
+
// Read from secondary (eventual consistency)
|
|
683
|
+
db.users.find().readPref("secondary");
|
|
684
|
+
|
|
685
|
+
// Read from primary preferred
|
|
686
|
+
db.users.find().readPref("primaryPreferred");
|
|
687
|
+
|
|
688
|
+
// Read from nearest (lowest latency)
|
|
689
|
+
db.users.find().readPref("nearest");
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
**Write Concerns:**
|
|
693
|
+
```javascript
|
|
694
|
+
// Wait for write to be acknowledged by majority
|
|
695
|
+
db.orders.insertOne(
|
|
696
|
+
{ user_id: "user123", total: 99.99 },
|
|
697
|
+
{ writeConcern: { w: "majority", wtimeout: 5000 } }
|
|
698
|
+
);
|
|
699
|
+
|
|
700
|
+
// Write to primary only (faster, less durable)
|
|
701
|
+
db.logs.insertOne(
|
|
702
|
+
{ message: "User logged in" },
|
|
703
|
+
{ writeConcern: { w: 1 } }
|
|
704
|
+
);
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
---
|
|
708
|
+
|
|
709
|
+
## Query Optimization
|
|
710
|
+
|
|
711
|
+
### Use Indexes
|
|
712
|
+
|
|
713
|
+
**Always create indexes for queried fields:**
|
|
714
|
+
|
|
715
|
+
```javascript
|
|
716
|
+
// Create index
|
|
717
|
+
db.users.createIndex({ email: 1 });
|
|
718
|
+
|
|
719
|
+
// Query uses index
|
|
720
|
+
db.users.find({ email: "john@example.com" });
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### Analyze Query Performance
|
|
724
|
+
|
|
725
|
+
**Use explain() to analyze queries:**
|
|
726
|
+
|
|
727
|
+
```javascript
|
|
728
|
+
// Explain query execution
|
|
729
|
+
db.users.find({ email: "john@example.com" }).explain("executionStats");
|
|
730
|
+
|
|
731
|
+
// Look for:
|
|
732
|
+
// - "IXSCAN" (index scan) vs "COLLSCAN" (collection scan)
|
|
733
|
+
// - executionTimeMillis
|
|
734
|
+
// - totalDocsExamined vs nReturned
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### Covered Queries
|
|
738
|
+
|
|
739
|
+
**Query only indexed fields (no document fetch):**
|
|
740
|
+
|
|
741
|
+
```javascript
|
|
742
|
+
// Create index
|
|
743
|
+
db.users.createIndex({ email: 1, name: 1 });
|
|
744
|
+
|
|
745
|
+
// Covered query (only returns indexed fields)
|
|
746
|
+
db.users.find(
|
|
747
|
+
{ email: "john@example.com" },
|
|
748
|
+
{ _id: 0, email: 1, name: 1 }
|
|
749
|
+
);
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
### Limit Results
|
|
753
|
+
|
|
754
|
+
**Always limit results when possible:**
|
|
755
|
+
|
|
756
|
+
```javascript
|
|
757
|
+
// Limit to 10 results
|
|
758
|
+
db.users.find({ status: "active" }).limit(10);
|
|
759
|
+
|
|
760
|
+
// Pagination
|
|
761
|
+
db.users.find({ status: "active" }).skip(20).limit(10);
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
### Project Only Needed Fields
|
|
765
|
+
|
|
766
|
+
**Don't fetch unnecessary fields:**
|
|
767
|
+
|
|
768
|
+
```javascript
|
|
769
|
+
// ❌ BAD: Fetch entire document
|
|
770
|
+
db.users.find({ status: "active" });
|
|
771
|
+
|
|
772
|
+
// ✅ GOOD: Fetch only needed fields
|
|
773
|
+
db.users.find(
|
|
774
|
+
{ status: "active" },
|
|
775
|
+
{ name: 1, email: 1, _id: 0 }
|
|
776
|
+
);
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
### Avoid Large Documents
|
|
780
|
+
|
|
781
|
+
**Keep documents under 16MB (MongoDB limit):**
|
|
782
|
+
|
|
783
|
+
```javascript
|
|
784
|
+
// ❌ BAD: Unbounded array growth
|
|
785
|
+
{
|
|
786
|
+
"_id": "user123",
|
|
787
|
+
"events": [/* thousands of events */]
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// ✅ GOOD: Reference separate collection
|
|
791
|
+
{
|
|
792
|
+
"_id": "user123",
|
|
793
|
+
"name": "John Doe"
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
// Events in separate collection
|
|
797
|
+
{
|
|
798
|
+
"_id": "event456",
|
|
799
|
+
"user_id": "user123",
|
|
800
|
+
"type": "login",
|
|
801
|
+
"timestamp": "2024-01-15T10:00:00Z"
|
|
802
|
+
}
|
|
803
|
+
```
|
|
804
|
+
|
|
805
|
+
---
|
|
806
|
+
|
|
807
|
+
## Best Practices
|
|
808
|
+
|
|
809
|
+
### DO
|
|
810
|
+
|
|
811
|
+
✅ **Design schema for your queries** (query-driven design)
|
|
812
|
+
✅ **Use embedding for one-to-few relationships**
|
|
813
|
+
✅ **Use referencing for one-to-many relationships**
|
|
814
|
+
✅ **Create indexes for frequently queried fields**
|
|
815
|
+
✅ **Use aggregation pipelines for complex queries**
|
|
816
|
+
✅ **Implement schema validation** (MongoDB schema validation)
|
|
817
|
+
✅ **Use transactions when needed** (MongoDB 4.0+)
|
|
818
|
+
✅ **Monitor query performance** with explain()
|
|
819
|
+
✅ **Shard for horizontal scalability**
|
|
820
|
+
✅ **Replicate for high availability**
|
|
821
|
+
|
|
822
|
+
### DON'T
|
|
823
|
+
|
|
824
|
+
❌ **Don't over-normalize** - embrace denormalization
|
|
825
|
+
❌ **Don't create unbounded arrays** - use separate collections
|
|
826
|
+
❌ **Don't skip indexing** - queries will be slow
|
|
827
|
+
❌ **Don't use monotonically increasing shard keys**
|
|
828
|
+
❌ **Don't ignore document size limits** (16MB in MongoDB)
|
|
829
|
+
❌ **Don't fetch entire documents** - project only needed fields
|
|
830
|
+
❌ **Don't use $where or $regex without indexes**
|
|
831
|
+
❌ **Don't forget to validate data** at application level
|
|
832
|
+
❌ **Don't ignore replication lag** - use appropriate read preferences
|
|
833
|
+
❌ **Don't skip backups** - data loss is catastrophic
|
|
834
|
+
|
|
835
|
+
---
|
|
836
|
+
|
|
837
|
+
## Summary
|
|
838
|
+
|
|
839
|
+
**Document stores are ideal for:**
|
|
840
|
+
- Flexible schema requirements
|
|
841
|
+
- Nested/hierarchical data
|
|
842
|
+
- Read-heavy workloads
|
|
843
|
+
- Horizontal scalability
|
|
844
|
+
|
|
845
|
+
**Key patterns:**
|
|
846
|
+
- **Embedding**: One-to-few relationships, data accessed together
|
|
847
|
+
- **Referencing**: One-to-many relationships, data accessed independently
|
|
848
|
+
- **Hybrid**: Combine embedding and referencing for optimal performance
|
|
849
|
+
|
|
850
|
+
**Performance tips:**
|
|
851
|
+
- Create indexes for queried fields
|
|
852
|
+
- Use aggregation pipelines for complex queries
|
|
853
|
+
- Limit and project results
|
|
854
|
+
- Monitor with explain()
|
|
855
|
+
- Shard for scale, replicate for availability
|
|
856
|
+
|