appolo-mongo

8.2.1 • Public • Published

Appolo Mongo

Define Mongoose models using TypeScript classes.

Installation

npm i @appolo/mongo

Usage

import {schema,prop,Model,model,Ref,injectModel,Doc} from "@appolo/mongo";

@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
    
    @prop(Address)
    address:Address
}

@schema()
export class Address{
    @prop({type:String})
    street:string
    
    @prop({type:String})
    city:string
}


@schema()
export class Comment{
    @prop({type:String})
    text:string
    
    @prop({ref:User})
    user:Ref<User>
}


let userModel = User.getModel<User>(mongoose.connection);
userModel.findById("someid")

Schema

options

@schema(collectionName:string,options:SchemaOptions)

define new schema with collectionName and mongose schema options

@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
    
    @prop(Address)
    address:Address
}

prop

The prop decorator define class property to the Mongoose schema as a property

@prop({ type:String })
firstName: string;

subDocument

define sumDocument

@schema()
export class Address{
    @prop({type:String})
    street:string
    
    @prop({type:String})
    city:string
}


@schema()
export class User{
    @prop(Address)
    address:Address
}

ref

add ref to another mongoose schema the ref schema must be defined as model with model

@model()
@schema()
export class User{
    @prop()
    name:string
}

@model()
@schema()
export class Comment{
    @prop({ref:User})
    user:Ref<User>
}

arrays

define any field as array using []

@prop([ type: String ])
names?: string[];

@prop([Address])
addresses:Address[]

@prop([{ref:User}])
user:Ref<User>[]

required

define required field

@prop({ type:String ,required:true})
firstName: string;

index

define index field

@prop({ index: true })
name?: string;

unique

define unique field

@prop({ unique: true })
someId?: string;

enum

define enum field

enum Gender {
  MALE = 'male',
  FEMALE = 'female',
}
@prop({ enum: Gender })
gender?: Gender;

default

define field with default

@prop({ type: String,default:"myName" })
name?: string;

validate

validate using minlength / maxlength / match / min /max same as mongoose

@prop({ minlength: 5, maxlength: 10, match: /[0-9a-f]*/ })
phone: string;

custom validate

or use custom validator same as mongoose

@prop({
    type: String,
    validate: {
        validator: function(v) {
            return /\d{3}-\d{3}-\d{4}/.test(v);
        }
    },
    message: props => `${props.value} is not a valid phone number!`
})
phone: string;

virtual

define virtual getter setters as in mongoose

@prop()
firstName?: string;

@prop()
lastName?: string;

@virtual() // this will create a virtual property called 'fullName'
get fullName() {
  return `${this.firstName} ${this.lastName}`;
}
set fullName(full:string) {
  const [firstName, lastName] = full.split(' ');
  this.firstName = firstName;
  this.lastName = lastName;
}

static method

define static method as in mongoose the method will be created on the mongose model

@staticMethod()
static findByName(this: Model<User>, name: string) {
  return this.findOne({ name });
}
@define()
@singleton()
export class SomeManager {

    @injectModel(User) userModel:Model<User> & typeof User;

    async getUser(name:string): Promise<Doc<User>> {
        let user = await this.userModel.findByName(name)

        return user;
    }
}

you need added the typeof User in order to use the static method findByName

instance Method

define instance method as in mongoose instance methods are created on mongoose document

@method()
addAge(this: Doc<User>,age?:number) {
  this.age = this.age + (age ||1 );
  return this.save();
}

pre

define mongoose pre hooks the pre function will be executed before the defined hook

@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
    
    @pre("save")
    private preSave(this:Doc<User>,next){
        if (this.name === 'aaa') {
            this.name = 'bbb';
        }
        next();
    }
}

post

define mongoose post hooks the post function will be executed after the defined hook

@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
    
    @post("save")
    private preSave(doc:Doc<User>,next){
          console.log('%s has been saved', doc._id);
          next();
    }
}

Schema Api

collectionName

get the defined collection name on schema

@model()
@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
}

User.collectionName // "user"

getSchema

return mongoose schema object

@model()
@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
}

let schema  = User.getSchema() 

getModel

define and mongoose model instance by mongoose connection

@model()
@schema("User",{strict:true})
export class User{
    @prop({type:String})
    name:string
}

let model  = User.getModel<User>(mongoose.connection) 

model.findById("someId")

Readme

Keywords

Package Sidebar

Install

npm i appolo-mongo

Weekly Downloads

37

Version

8.2.1

License

MIT

Unpacked Size

33 kB

Total Files

14

Last publish

Collaborators

  • shmoop207