typemongoose
v1.2.0
Published
Typescript ORM for mongoose
Downloads
8
Readme
typemongoose
Typescript wrapper for mongoose library
Installation
npm install --save typemongoose
It makes use of decorators. Check the example below
import * as mongoose from "mongoose";
import { BaseModel, Decorators, ModelRepo } from "typemongoose";
const {
Hook,
Hooks,
HookTypes,
Member,
Method,
Model
} = Decorators;
@Model<User>()
export abstract class User extends BaseModel {
@Member({ type: String })
public name: string;
@Member({ type: Date })
public dob: Date;
@Member({ type: Boolean })
public isMale: boolean;
@Member({ type: Date })
public created_at: Date;
@Member({ type: Date })
public updated_at: Date;
@Method()
public getName(): string {
return this.name;
}
@Method()
public async updateName(name): Promise<string> {
this.name = name;
await this.save();
return name;
}
@Hook(HookTypes.pre, Hooks.save)
private async beforeSave() {
if (!this.created_at) {
this.created_at = new Date();
}
this.updated_at = new Date();
}
}
class RUser extends ModelRepo<User> {
protected getModelName() {
return "User";
}
public async getAllObjects(): Promise<User[]> {
return this.query.find({});
}
}
const UserRepo = new RUser();
Note
- The object (
User
) should be abstract. The reason is, mongoose itself creates a object, extending the class we provide - To create new object you can do as explained below
const user = UserRepo.create({...}); // save will get automatically
or
const user = new UserRepo.query({...});
user.save();
- You can define hooks as explained above. Hooke type can be
HookTypes.pre
orHookTypes.post
and hooks can beHooks.init
,Hooks.remove
,Hooks.save
,Hooks.update
andHooks.validate
- If you do not want to have new repo for the model, you can use
BasicRepo
as explained below
import { BasicRepo } from "typemongoose";
class Book extends ... {...};
const BookRepo = new BasicRepo(Book);
Here you have two type of objects
User
It is the base object you will get when query. You can define methods to it assigning decorator.UserRepo
It is the Repository for theUser
object. You can define static methods here. You can query everything we use on mongoose object fromUserRepo.query
. Check following example
const all = await UserRepo.query.find({});
const user = await UserRepo.query.findOne({...});
When you have reference members, you can define them as below
@Model<Book>()
export abstract class Book extends BaseModel {
@Member({ type: String })
public name: string;
@Member({ type: mongoose.Schema.Types.ObjectId, ref: "User" })
public user: string|User;
}
class RBook extends ModelRepo<Book> {
protected getModelName() {
return "Book";
}
}
const BookRepo = new RBook();
And you can use it as
const book = BookRepo.findOne({}).populate("user");
const user: User = book.user;
user.getName();
Or
const book = BookRepo.findOne({});
const user: String = book.user.toString(); // it will be id now