UNPKG

mongo-pipeline-kit

Version:

A feature-rich MongoDB pipeline builder kit for creating, reusing, and managing aggregation pipelines with enhanced JSON support and advanced utilities

349 lines (266 loc) 11 kB
# Mongo Pipeline Kit A feature-rich MongoDB pipeline builder kit for creating, reusing, and managing aggregation pipelines with ease. Now with enhanced JSON support, pipeline utilities, and advanced analysis capabilities. ## Features - 🏗️ Object-oriented pipeline building - 🔄 Reusable pipeline components - 🎯 Type-safe pipeline construction - 📦 Pipeline composition and chaining - 🔍 Built-in pipeline validation - 📝 Comprehensive pipeline documentation - 🧩 Modular and extensible design - 📄 **NEW**: JSON export/import functionality - 🛠️ **NEW**: Advanced pipeline utilities and analysis - 📊 **NEW**: Pipeline statistics and complexity estimation - 🔄 **NEW**: Pipeline comparison and manipulation tools ## Installation ```bash npm install mongo-pipeline-kit ``` ## Quick Start ```typescript import { PipelineBuilder } from "mongo-pipeline-kit"; // Create a new pipeline builder const builder = new PipelineBuilder(); // Add stages to your pipeline const pipeline = builder .match({ status: "active" }) .group({ _id: "$category", total: { $sum: 1 }, items: { $push: "$$ROOT" }, }) .sort({ total: -1 }) .limit(10) .build(); // Use the pipeline with MongoDB const results = await collection.aggregate(pipeline).toArray(); ``` ## JSON Export/Import ### Export Pipeline to JSON ```typescript import { PipelineBuilder } from "mongo-pipeline-kit"; const builder = new PipelineBuilder() .match({ status: "active" }) .group({ _id: "$category", count: { $sum: 1 } }) .sort({ count: -1 }) .limit(10); // Get JSON string (compact) const jsonString = builder.toJSON(); console.log(jsonString); // Output: [{"$match":{"status":"active"}},{"$group":{"_id":"$category","count":{"$sum":1}}},{"$sort":{"count":-1}},{"$limit":10}] // Get JSON string (pretty formatted) const prettyJson = builder.toJSON(true); console.log(prettyJson); // Output: Formatted JSON with indentation // Export with metadata const exportData = builder.exportWithMetadata({ description: "Active users by category", author: "John Doe", version: "1.0.0", }); ``` ### Import Pipeline from JSON ```typescript import { PipelineUtils } from "mongo-pipeline-kit"; const jsonString = `[ {"$match": {"status": "active"}}, {"$group": {"_id": "$category", "count": {"$sum": 1}}}, {"$sort": {"count": -1}}, {"$limit": 10} ]`; // Parse JSON string to pipeline const pipeline = PipelineUtils.fromJSON(jsonString); // Use with PipelineBuilder const builder = new PipelineBuilder(); pipeline.forEach((stage) => builder.addStage(stage)); ``` ## Pipeline Utilities ### Pipeline Analysis ```typescript import { PipelineUtils } from "mongo-pipeline-kit"; const pipeline = [ { $match: { status: "active" } }, { $group: { _id: "$category", count: { $sum: 1 } } }, { $sort: { count: -1 } }, { $limit: 10 }, ]; // Get pipeline statistics const stats = PipelineUtils.getStats(pipeline); console.log(stats); // Output: // { // stageCount: 4, // stageTypes: { '$match': 1, '$group': 1, '$sort': 1, '$limit': 1 }, // totalSize: 156, // estimatedComplexity: 6 // } // Get human-readable description const description = PipelineUtils.describe(pipeline); console.log(description); ``` ### Pipeline Manipulation ```typescript // Clone a pipeline const clonedPipeline = PipelineUtils.clone(pipeline); // Filter stages by type const matchStages = PipelineUtils.filterByStageType(pipeline, "$match"); // Remove specific stage type const pipelineWithoutLimit = PipelineUtils.removeStageType(pipeline, "$limit"); // Insert a stage at specific position const newPipeline = PipelineUtils.insertStage(pipeline, 1, { $addFields: { processed: true }, }); // Replace a stage const modifiedPipeline = PipelineUtils.replaceStage(pipeline, 0, { $match: { status: "inactive" }, }); ``` ### Pipeline Comparison ```typescript const pipeline1 = [ { $match: { status: "active" } }, { $group: { _id: "$category", count: { $sum: 1 } } }, ]; const pipeline2 = [ { $match: { status: "active" } }, { $group: { _id: "$category", count: { $sum: 1 } } }, { $sort: { count: -1 } }, ]; const comparison = PipelineUtils.compare(pipeline1, pipeline2); console.log(comparison); ``` ## Advanced Usage ### Creating Reusable Pipeline Components ```typescript import { PipelineBuilder, PipelineStage } from "mongo-pipeline-kit"; // Define a reusable pipeline component const activeUsersStage: PipelineStage = { $match: { status: "active", lastLogin: { $gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) }, }, }; // Use the component in multiple pipelines const userStatsPipeline = builder .addStage(activeUsersStage) .group({ _id: "$role", count: { $sum: 1 }, }) .build(); ``` ### Pipeline Composition ```typescript import { PipelineBuilder, PipelineComposer } from "mongo-pipeline-kit"; const composer = new PipelineComposer(); // Create separate pipeline segments const filteringPipeline = builder.match({ status: "active" }).build(); const aggregationPipeline = builder .group({ _id: "$category", total: { $sum: "$amount" }, }) .build(); // Compose pipelines const finalPipeline = composer .compose(filteringPipeline, aggregationPipeline) .build(); // Export composed pipeline with metadata const exportData = composer.exportWithMetadata({ description: "Composed pipeline for user analytics", tags: ["analytics", "users"], }); ``` ## API Documentation ### PipelineBuilder The main class for building MongoDB aggregation pipelines. #### Core Methods - `addFields(fields: object)`: Add a `$addFields` stage - `addStage(stage: PipelineStage)`: Add a custom pipeline stage - `bucket(options: object)`: Add a `$bucket` stage - `bucketAuto(options: object)`: Add a `$bucketAuto` stage - `build()`: Build the final pipeline array - `collStats(options: object)`: Add a `$collStats` stage - `count(fieldName: string)`: Add a `$count` stage - `facet(options: object)`: Add a `$facet` stage - `geoNear(options: object)`: Add a `$geoNear` stage - `graphLookup(options: object)`: Add a `$graphLookup` stage - `group(expression: object)`: Add a `$group` stage - `indexStats(options: object)`: Add a `$indexStats` stage - `limit(n: number)`: Add a `$limit` stage - `lookup(options: object)`: Add a `$lookup` stage - `match(condition: object)`: Add a `$match` stage - `merge(options: object)`: Add a `$merge` stage - `out(collection: string | object)`: Add an `$out` stage - `project(projection: object)`: Add a `$project` stage - `redact(expression: object)`: Add a `$redact` stage - `replaceRoot(newRoot: object)`: Add a `$replaceRoot` stage - `replaceWith(newRoot: object)`: Add a `$replaceWith` stage - `sample(options: { size: number })`: Add a `$sample` stage - `setWindowFields(options: object)`: Add a `$setWindowFields` stage - `skip(n: number)`: Add a `$skip` stage - `sort(sort: object)`: Add a `$sort` stage - `sortByCount(expression: any)`: Add a `$sortByCount` stage - `unionWith(options: string | object)`: Add a `$unionWith` stage - `unset(fields: string | string[])`: Add an `$unset` stage - `unwind(field: string | object)`: Add a `$unwind` stage #### New JSON Export Methods - `toJSON(pretty?: boolean)`: Convert pipeline to JSON string - `toObject()`: Get pipeline as plain object - `exportWithMetadata(metadata)`: Export pipeline with additional metadata - `toString()`: Get human-readable string representation #### Pipeline Management Methods - `clear()`: Clear all stages from the pipeline - `getStageCount()`: Get the current number of stages - `getStage(index: number)`: Get a specific stage - `replaceStage(index: number, stage: PipelineStage)`: Replace a stage - `removeStage(index: number)`: Remove a stage ### PipelineComposer Utility class for composing and reusing pipeline segments. #### Methods - `compose(...pipelines: Pipeline[])`: Compose multiple pipelines - `extend(basePipeline: Pipeline, extension: Pipeline)`: Extend an existing pipeline - `validate(pipeline: Pipeline)`: Validate a pipeline structure - `toJSON(pretty?: boolean)`: Convert composed pipeline to JSON - `toObject()`: Get composed pipeline as plain object - `exportWithMetadata(metadata)`: Export with metadata - `toString()`: Get human-readable representation - `hasStage(operator: string)`: Check if pipeline contains specific stage type - `getStagesByType(operator: string)`: Get all stages of a specific type ### PipelineUtils Static utility class for pipeline operations and analysis. #### Methods - `fromJSON(jsonString: string)`: Parse JSON string to pipeline - `toJSON(pipeline: Pipeline, pretty?: boolean)`: Convert pipeline to JSON - `validate(pipeline: Pipeline, options?)`: Validate pipeline structure - `clone(pipeline: Pipeline)`: Deep copy pipeline - `getStats(pipeline: Pipeline)`: Get pipeline statistics - `describe(pipeline: Pipeline)`: Get human-readable description - `compare(pipeline1: Pipeline, pipeline2: Pipeline)`: Compare two pipelines - `filterByStageType(pipeline: Pipeline, operator: string)`: Filter stages by type - `removeStageType(pipeline: Pipeline, operator: string)`: Remove stages by type - `insertStage(pipeline: Pipeline, index: number, stage: PipelineStage)`: Insert stage - `replaceStage(pipeline: Pipeline, index: number, stage: PipelineStage)`: Replace stage ## Examples For comprehensive examples of all features, see [EXAMPLES.md](EXAMPLES.md). ## 🐛 Issues & Support ### Getting Help If you encounter any issues or need help with mongo-pipeline-kit: 1. **📚 Check Documentation**: Review the [README.md](README.md) and [EXAMPLES.md](EXAMPLES.md) 2. **🔍 Search Issues**: Look for similar issues in [GitHub Issues](https://github.com/arjun-computer-geek/mongo-pipeline-kit/issues) 3. **🐛 Report Bugs**: Create a bug report using our [issue template](https://github.com/arjun-computer-geek/mongo-pipeline-kit/issues/new?template=bug_report.md) 4. **🚀 Request Features**: Suggest new features using our [feature request template](https://github.com/arjun-computer-geek/mongo-pipeline-kit/issues/new?template=feature_request.md) 5. **❓ Ask Questions**: Use our [question template](https://github.com/arjun-computer-geek/mongo-pipeline-kit/issues/new?template=question.md) for help 6. **📧 Email Support**: Contact arjun2000raj@gmail.com for private matters ### Issue Guidelines - **Use Templates**: We provide issue templates for bugs, features, and questions - **Include Details**: Provide environment info, code examples, and error messages - **Be Specific**: Describe what you're trying to achieve and what went wrong - **Search First**: Check existing issues to avoid duplicates For detailed information about reporting issues, see [ISSUES.md](ISSUES.md). ## Contributing We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details on how to get started. ## Publishing For information about publishing new versions, please refer to our [Publishing Guide](PUBLISHING.md). ## License MIT