npm.io
0.0.20 • Published 3 years ago

mongoosejs-model

Licence
MIT
Version
0.0.20
Deps
4
Size
33 kB
Vulns
0
Weekly
0

Mongoose.js model manager by javascript class

Installation instruction:

npm install mongoosejs-model

Use:

Connect to databse
const mongoose = require("mongoose");

const startDatabase = () => {
  return new Promise((resolve, reject) => {
    mongoose.connect(uri)
      .then(() => {
        console.log("💪 connected to DB.");
        resolve();
      })
      .catch(err => {
        console.log("DB connection error:", err);
        startDatabase();
        reject(err);
      });
  });
};
const { init } = require("mongoosejs-model");
init(require("mongoose"));
Define field
const { Field } = require("mongoosejs-model");
let field1 = new Field({
  isRequire: true,
  isArray: true,
  default: ["test"],
  type: String,
});
Define enum
const { Enum } = require("mongoosejs-model");
let field1 = new Enum({
  multi: false,
  default: "E1",
  keys: ["E1", "E2"],
});

OR

const { Enum } = require("mongoosejs-model");
const EConst1 = Object.freeze({
  E1: "E1",
  E2: "E2",
});
let field1 = new Enum({
  multi: false,
  default: "E1",
  type: EConst1,
});
const { Enum } = require("mongoosejs-model");
let field2 = new Enum({
  multi: true,
  default: ["E1"],
  keys: ["E1", "E2"],
});
Define model as subdocument:
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });
}
Model enum methods:
const { Model, Field, Enum } = require("mongoosejs-model");

class Person extends Model {
  gender = new Enum({ keys: ["MALE", "FEMALE"] });
  properties = new Enum({ keys: ["CAR", "HOUSE"], multi: true });
  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });
}

Person.create({ firstName: "hasan", lastName: "Kachal", gender: "MALE", properies: ["CAR", "HOUSE"] });

genderHasKey("MALE"); // Returns 'true'
genderHasKey("FEMALE"); // Returns 'true'

genderCheck("FEMALE"); // Returns 'false'
genderCheck("MALE"); // Returns 'true'

genderCompare("FEMALE"); // Returns 'false'
genderCompare("MALE"); // Returns 'true'


propertiesHasKey("CAR"); // Returns 'true'
propertiesHasKey("HOUSE"); // Returns 'true'

propertiesCheck("HOUSE"); // Returns 'true'
propertiesCheck("CAR"); // Returns 'true'

propertiesCompare("HOUSE"); // Returns 'false'
propertiesCompare("CAR"); // Returns 'false'
propertiesCompare("HOUSE", "CAR"); // Returns 'true'
Define model as collection
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });
}
Inheritance models
const EEngine = Object.freeze({
  ELECTRIC: "ELECTRIC",
  GAS: "GAS",
  GASOLINE: "GASOLINE",
  HYBRID: "HYBRID",
});

class Vehicle extends Model {
  color = new Field({ isRequire: true, type: String });
  width = new Field({ isRequire: true, type: Number });
  length = new Field({ isRequire: true, type: Number });
  height = new Field({ isRequire: true, type: Number });
  engineType = new Enum({ type: EEngine });
}

class LandVehicleInfo extends Model {
  wheels = new Field({ isRequier: true, type: Number });
  doors = new Field({ isRequier: true, type: Number });
}

class WaterVehicleInfo extends Model {
  floors = new Field({ isRequire: true, type: Number });
  helipad = new Field({ default: false, type: Boolean });
}

class ElectricEngine extends Vehicle {
  batteryCapacity = new Field({ isRequire: true, type: Number });

  check(next) {
    this.engineType = EEngine.ELECTRIC;
    next();
  }
}

class GasEngine extends Vehicle {
  fuelCapacity = new Field({ isRequire: true, type: Number });

  check(next) {
    this.engineType = EEngine.GAS;
    next();
  }
}

class GasolineEngine extends Vehicle {
  fuelCapacity = new Field({ isRequire: true, type: Number });

  check(next) {
    this.engineType = EEngine.GASOLINE;
    next();
  }
}

class HybridEngine extends Vehicle {
  fuelCapacity = new Field({ isRequire: true, type: Number });
  batteryCapacity = new Field({ isRequire: true, type: Number });

  check(next) {
    this.engineType = EEngine.HYBRID;
    next();
  }
}

class ElectricBycicle extends ElectricEngine {
  static get modelName() {
    return "landVehicle";
  }

  vehicleInfo = new Field({ isRequire: true, type: LandVehicleInfo });
}

class SedanCar extends GasEngine {
  static get modelName() {
    return "landVehicle";
  }

  vehicleInfo = new Field({ isRequire: true, type: LandVehicleInfo });
}

class HybridVan extends HybridEngine {
  static get modelName() {
    return "landVehicle";
  }

  vehicleInfo = new Field({ isRequire: true, type: LandVehicleInfo });
}

class Truck extends GasolineEngine {
  static get modelName() {
    return "landVehicle";
  }

  vehicleInfo = new Field({ isRequire: true, type: LandVehicleInfo });
}

class Boat extends GasolineEngine {
  static get modelName() {
    return "waterVehicle";
  }

  vehicleInfo = new Field({ isRequire: true, type: WaterVehicleInfo });
}

const bycicle1 = ElectricBycicle.create({
  color: "white",
  width: 20,
  length: 100,
  height: 95,
  batteryCapacity: 100000,
  vehicleInfo: {
    wheels: 2,
    doors: 0,
  },
});

const boat1 = Boat.create({
  color: "red",
  width: 20,
  length: 100,
  height: 95,
  fuelCapacity: 200,
  vehicleInfo: {
    floors: 1,
    doors: 0,
  },
});

await bycicle1.save();
await boat1.save();
Define virtual fields
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }
}
Use collection methods
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }
}

Person.collection.findOne({
  firstName: "jack",
  lastName: "gonjishke"
});
Define collection methods
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    return this.collection.find({});
  }
}
Create new document
const { Model, Field } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    return this.collection.find({});
  }
}

Person.create({firstName: "jack", lastName: "gonjishke"});
Person.save().then(person => {
  console.log(person);
});
Use aggregation in collection methods
const { Model, Field, sort } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    const agrPerson = this.collection.aggregate();
    agrPerson.append({$match: {
      firstName: "jack",
    }});
    
    return agrPerson.exec();
  }
}
Sort result (by aggregation)
const { Model, Field, sort } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    const agrPerson = this.collection.aggregate();

    sort(agrPerson, "-lastName");
    return agrPerson.exec();
  }
}
Filter result (by aggregation)
const { Model, Field, filter } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    const agrPerson = this.collection.aggregate();

    filter(agrPerson, {
      lastName: "gonjishke"
    });
    return agrPerson.exec();
  }
}
Complecated filters
const { Model, Field, filter } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    const agrPerson = this.collection.aggregate();

    filter(agrPerson, {
      "firstName|lastName": "gonjishke|gandomi",
    });
    return agrPerson.exec();
  }
}
Filter operators
  • Key part:
No. Symbol Operator Sample
1 | Or {"firstName|lastName": ...}
2 ! Not {"gender!": ...}
3 > Greater {"age>": ...}
4 >= Greater Or Equal {"age>=": ...}
5 > Less {"age<": ...}
6 >= Less Or Equal {"age<=": ...}
  • Value part:
No. Symbol Operator Sample
1 | Or {...: "gonjishke|gandomi"}
  • Mix:
{
  "firstName|lastName": "gonjishke|gandomi"
}
Paginate result (by aggregation)
const { Model, Field, paginate } = require("mongoosejs-model");

class Person extends Model {
  static get modelName() {
    return "person";
  }

  firstName = new Field({ isRequire: true, type: String });
  lastName = new Field({ isRequire: true, type: String });

  get fullName() {
    return this.firstName + " " + this.lastName;
  }

  static getAllPersons() {
    const agrPerson = this.collection.aggregate();

    paginate(agrPerson, 0 /* Page number */, 10 /* Page size */);
    return agrPerson.exec();
  }
}

Keywords