@knymbus/mongobackend
v1.0.6
Published
A lightweight, type-safe wrapper for the MongoDB Node.js driver using the Repository pattern.
Downloads
536
Readme
MongoDB Repository Library
A lightweight, type-safe wrapper for the MongoDB Node.js driver using the Repository pattern.
Overview
This library consists of two main components:
- MongoBackend: Manages the database connection and serves as a factory for repositories.
- BaseRepository: An abstract class providing standard CRUD operations, automatic timestamping, and versioning.
1. MongoBackend
Configuration & Connection
import { MongoClient } from 'mongodb';
import { MongoBackend } from '@knymbus/mongobackend';
const client = new MongoClient('mongodb://localhost:27017');
const backend = new MongoBackend({
mongo: client,
app: 'my_application_db'
});
// Explicitly connect and ping the server
await backend.connect();
// Check status
const isActive = await backend.isConnected(); Repository Factory
// Automatically injects the DB instance into your repository class
const userRepo = backend.getRepo(UserRepository);2. BaseRepository
To create a repository, extend the BaseRepository class and provide your document type.
Implementation
import { BaseRepository } from '@knymbus/mongobackend';
import { Db, ClientSession, ObjectId } from 'mongodb';
interface User {
_id?: ObjectId;
name: string;
email: string;
createdAt?: Date;
updatedAt?: Date;
version?: number;
}
export class UserRepository extends BaseRepository<User> {
constructor(db: Db, session?: ClientSession) {
// Pass the database and the collection name
super(db, 'users', session);
}
}Core Methods
Create
Automatically adds createdAt, updatedAt, and version: 1.
const user = await userRepo.create({ name: 'Alice', email: '[email protected]' });Read
// Find by ID (String or ObjectId)
const user = await userRepo.findById('65f1...89a');
// Find One by filter
const user = await userRepo.findOne({ email: '[email protected]' });
// Find All
const activeUsers = await userRepo.findAll({ status: 'active' });
// Count
const total = await userRepo.count({ role: 'admin' });Update
// Update by ID
const updated = await userRepo.updateById(userId, { $set: { name: 'Alice Smith' } });
// Find and Update with filter
const result = await userRepo.update({ email: '[email protected]' }, { $set: { email: '[email protected]' } });Delete
await userRepo.deleteById(userId);
await userRepo.deleteAll({ status: 'inactive' });Advanced Operations
Bulk Write
await userRepo.bulkWrite([
{ insertOne: { document: { name: 'Bob' } } },
{ updateOne: { filter: { name: 'Alice' }, update: { $set: { status: 'active' } } } }
]);Aggregation
const cursor = userRepo.aggregate([
{ $match: { score: { (gt: 80 } } }, {\)sort: { score: -1 } }
]);
const topStudents = await cursor.toArray();Dynamic Collection Switching
Create a new instance of the same repository class targeting a different collection:
const logRepo = userRepo.forCollection('users_archive');Testing with Jest
To run the included test suite, ensure you have jest, ts-jest, and @types/jest installed.
# Run tests
npm testThe tests use a mocked mongodb driver to ensure logic (like timestamp injection and ID conversion) works correctly without requiring a live database.
