Easy Mongo ORM
A powerful and elegant MongoDB/Mongoose toolkit that makes database operations a breeze with built-in caching, search, pagination, performance monitoring, soft delete, versioning, data export/import, schema validation, and migration utilities.
Features
- 🚀 Easy to Use: Simple and intuitive API
- 🔍 Advanced Search: Text, Geospatial, and Fuzzy search built-in
- 📄 Smart Pagination: Both regular and aggregation pagination support
- 💾 Caching: Built-in caching system for better performance
- 📊 Performance Monitoring: Track operation times and query performance
- 🔒 Rate Limiting: Protect your database from overload
- 🔄 Transactions: Easy-to-use transaction support
- 🔗 Population: Simple document population with depth control
- 🏗️ Query Builder: Fluent query building interface
- 📦 Bulk Operations: Efficient bulk create, update, and delete
- 🗑️ Soft Delete: Mark documents as deleted without removing them
- 📜 Versioning & Audit Trail: Track document changes over time
- 📤 Data Export/Import: Export and import data in JSON and CSV formats
- ✅ Schema Validation: Enhanced validation beyond Mongoose's built-in validation
- 🔄 Data Migration: Tools for schema migrations and data transformations
Installation
npm install easy-mongo-orm mongoose
Quick Start
const { EasyMongo } = require('easy-mongo-orm');
const userDb = new EasyMongo({
connection: {
uri: 'mongodb://localhost:27017/mydb'
},
model: {
name: 'User',
schema: {
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: Number,
tags: [String]
},
options: {
timestamps: true
}
},
features: {
enableCache: true,
enablePerformanceMonitoring: true
}
});
await userDb.connect();
const user = await userDb.create({
name: 'John Doe',
email: 'john@example.com',
age: 30,
tags: ['developer']
});
const results = await userDb.search({
text: 'John',
fields: ['name']
});
const { data, pagination } = await userDb.paginate(
{ age: { $gt: 25 } },
{ page: 1, limit: 10 }
);
const stats = userDb.getPerformanceStats();
Advanced Features
Text Search
const results = await userDb.search({
text: 'developer',
fields: ['tags', 'bio']
});
Geospatial Search
const nearbyUsers = await userDb.searchNearby({
coordinates: [-73.935242, 40.730610],
maxDistance: 1000
});
Fuzzy Search
const results = await userDb.fuzzySearch({
field: 'name',
query: 'jhon'
});
Query Builder
const users = await userDb
.query()
.where({ age: { $gt: 25 } })
.select('name email')
.sort('-createdAt')
.limit(10)
.execute();
Large Dataset Handling
const stream = userDb
.largeDataset()
.where({ status: 'active' })
.stream();
for await (const doc of stream) {
}
Transactions
await userDb.withTransaction(async (session) => {
const user = await userDb.create({
name: 'Alice',
email: 'alice@example.com'
}, { session });
await userDb.create({
name: 'Bob',
email: 'bob@example.com'
}, { session });
});
Caching
const user1 = await userDb.findOne({ email: 'john@example.com' });
const user2 = await userDb.findOne({ email: 'john@example.com' });
await userDb.clearCache('email:john@example.com');
await userDb.clearAllCache();
Performance Monitoring
const stats = userDb.getPerformanceStats();
console.log(stats);
Soft Delete
const userDb = new EasyMongo({
features: {
enableSoftDelete: true,
softDelete: {
deletedField: 'isDeleted',
deletedAtField: 'deletedAt'
}
}
});
await userDb.softDeleteById('60d21b4667d0d8992e610c85');
await userDb.softDelete({ status: 'inactive' });
await userDb.restoreById('60d21b4667d0d8992e610c85');
await userDb.restore({ status: 'inactive' });
const allUsers = await userDb.findWithDeleted({});
const deletedUsers = await userDb.findOnlyDeleted({});
Document Versioning & Audit Trail
const userDb = new EasyMongo({
features: {
enableVersioning: true,
versioning: {
historyCollectionName: 'UserHistory'
}
}
});
const history = await userDb.getDocumentHistory('60d21b4667d0d8992e610c85');
const v2 = await userDb.getDocumentVersion('60d21b4667d0d8992e610c85', 2);
await userDb.revertToVersion('60d21b4667d0d8992e610c85', 2, {
user: 'admin@example.com'
});
Data Export/Import
const userDb = new EasyMongo({
features: {
enableDataExport: true
}
});
await userDb.exportToJson(
{ status: 'active' },
'./exports/active-users.json',
{
projection: { password: 0 },
sort: { createdAt: -1 }
}
);
await userDb.exportToCsv(
{ status: 'active' },
'./exports/active-users.csv',
{
fields: ['name', 'email', 'createdAt']
}
);
await userDb.exportLargeDatasetToJson(
{ status: 'active' },
'./exports/all-active-users.json',
{ batchSize: 1000 }
);
await userDb.importFromJson(
'./imports/users.json',
{
replace: false,
upsert: true,
idField: '_id'
}
);
await userDb.importFromCsv(
'./imports/users.csv',
{
fieldTypes: {
age: 'number',
isActive: 'boolean',
joinDate: 'date'
}
}
);
Enhanced Schema Validation
const userDb = new EasyMongo({
features: {
enableSchemaValidator: true
}
});
const Joi = require('joi');
const commonSchemas = SchemaValidator.createCommonSchemas();
userDb.defineValidationSchema(Joi.object({
name: Joi.string().required(),
email: commonSchemas.email.required(),
password: commonSchemas.password,
age: Joi.number().min(18).max(100),
role: Joi.string().valid('user', 'admin', 'editor')
}));
try {
const validatedData = userDb.validate({
name: 'John Doe',
email: 'invalid-email',
age: 15
});
} catch (error) {
console.log(error.details);
}
const validatedData = await userDb.validateAsync(data);
Data Migration
const userDb = new EasyMongo({
features: {
enableMigration: true
}
});
userDb.registerMigration({
name: 'add-status-field',
version: 1,
description: 'Add status field to all users',
up: async () => {
const helper = userDb.migrationManager.createMigrationHelper(userDb.Model);
await helper.addField('status', 'active');
},
down: async () => {
const helper = userDb.migrationManager.createMigrationHelper(userDb.Model);
await helper.removeField('status');
}
});
userDb.registerMigration({
name: 'rename-bio-to-description',
version: 2,
description: 'Rename bio field to description',
up: async () => {
const helper = userDb.migrationManager.createMigrationHelper(userDb.Model);
await helper.renameField('bio', 'description');
},
down: async () => {
const helper = userDb.migrationManager.createMigrationHelper(userDb.Model);
await helper.renameField('description', 'bio');
}
});
const result = await userDb.applyMigrations();
console.log(`Applied ${result.applied} migrations`);
const status = await userDb.getMigrationStatus();
console.log(`Applied migrations: ${status.applied.length}`);
console.log(`Pending migrations: ${status.pending.length}`);
await userDb.rollbackLastMigration();
Configuration Options
Connection Options
{
uri: 'mongodb://localhost:27017/mydb',
options: {
useNewUrlParser: true,
useUnifiedTopology: true
}
}
Feature Options
{
enableCache: true,
cacheTTL: 3600,
enablePerformanceMonitoring: true,
enableRateLimit: true,
rateLimit: {
windowMs: 15 * 60 * 1000,
max: 100
},
enableSoftDelete: true,
softDelete: {
deletedField: 'isDeleted',
deletedAtField: 'deletedAt'
},
enableVersioning: true,
versioning: {
historyCollectionName: 'CustomHistoryCollection'
},
enableDataExport: true,
dataExport: {
},
enableSchemaValidator: true,
schemaValidator: {
},
enableMigration: true,
migration: {
}
}
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT © Md.Tousif