We are depracating this package. But you can use my mongoose fork or give me your support to have my pull request accepted!
Now it is easy to write inheritable and multi-inheritable schemas for your MongoDB database. mongoose-mischema depends on mongoose, which is an amazing and powerfull MongoDB object modeling for node.js.
npm install mongoose-mischema
MISchema constructor:
MISchema(
typeName[, inheritances], constructor[, options] )
-
typeName - <String> - Name of the "class" (schema)
-
inheritances - <MISchema Array> - Array of parent schemas
-
constructor - <Object> - Mongoose-like schema
-
options - <Object> - Options
- deconflict - <String> - String that solve sabe attribute name, default set to typeName + '_'
- mso - <Object> - Mongoose Schema Options, will be used when generating mongoose Schema
- amso - <Object> - Auto-generated Mongoose Schema Options, will be used when generating mongoose schemas for SubDocuments arrays, the default value is { _id: false }, which elimintes auto-generated ObjectIdS for SubDocuments arrays
Single inheritance:
const mischema = require('mongoose-mischema'),
MISchema = mischema.MISchema;
var tpLog = new MISchema('tpLog', {
archived: { type: Boolean, 'default': false },
});
// Inherits from tpLog
var tpPerson = new MISchema('tpPerson', [tpLog], {
name: String,
birthDate: Date,
});
// Get mongoose Schema
var personSchema = tpPerson.Schema;
// We provide a copy of mongoose.model
var Person = mischema.model('Person', personSchema);
var ChuckNorris = new Person({
name: "Chuck Norris",
birthDate: Date.now() + 1000*60*60*24, // He was born tomorrow :O
archived: true,
});
ChuckNorris.save(function(err) {
if (err) return handleErr(err);
});
/*
* > db.people.find().pretty()
* {
* "_id" : ObjectId("589349eb0b26cad4cf2ba238"),
* "name" : "Chuck Norris",
* "birthDate" : ISODate("2017-02-03T15:02:03.866Z"),
* "_kind" : "tpPerson",
* "_kinds" : [
* "tpLog"
* ],
* "archived" : true,
* "__v" : 0
* }
*/
It was automatically created an attribute called "_kinds" that automatically stores all schemas used in the compilation process, and can easely be checked with ofKind instance and static methods.
Using the ofKind:
ofKind(
type )
- type - <String>/<MISchema> - Type name or MISchema object
if (Person.ofKind('tpAddress') // false
console.log(':('); // Do not log it
if (ChuckNorris.ofKind(tpLog)) // true
console.log('\o/');
Complex Example:
const mischema = require('mongoose-mischema'),
MISchema = mischema.MISchema;
var tpAddress = new MISchema('tpAddress', {
street: { type: String, required: true },
street2: String,
street3: String,
postalCode: { type: String, required: true },
});
var tpOccupation = new MISchema('tpOccupation', {
occupation: { type: String,
enum: ['onSeller', 'onTechnician', 'onTeacher'] },
});
var tpPerson = new MISchema('tpPerson', {
name: String,
birthDate: Date,
addresses: [tpAddress],
});
var tpEmployee = new MISchema('tpEmployee', [tpOccupation, tpPerson]);
// Create mongoose Schema
var employeeSchema = tpEmployee.Schema;
// We have an helper to set required, awesome for big different projects that
// uses the same base model
employeeSchema.setRequired(['name', 'birthDate', 'subdoc.attr0'], true);
// Create model
var Employee = mischema.model('Employee', employeeSchema);
var ChuckNorris = new Employee({
name: "Chuck Norris",
birthDate: Date.now() + 1, // He was born tomorrow :O
addresses: [{ street: 'Maniacs Street', street2: '-1',
postalCode: 'XXX' }]
});
ChuckNorris.save(function(err) {
if (err) return console.log(err.message);
}).then(function() {
ChuckNorris.subdoc.attr0 = 'value';
ChuckNorris.save(function(err) {
if (err) return console.log(err.message);
console.log('success now');
})
});
/*
* Console:
* Employee validation failed
* sccess now
*
* Mongo Shell:
* > db.employees.find().pretty()
* {
* "_id" : ObjectId("5893514dd20b54d607fe58b9"),
* "name" : "Chuck Norris",
* "birthDate" : ISODate("2017-02-02T15:33:33.772Z"),
* "_kind" : "tpEmployee",
* "_kinds" : [
* "tpOccupation",
* "tpPerson"
* ],
* "addresses" : [
* {
* "street" : "Maniacs Street",
* "street2" : "-1",
* "postalCode" : "XXX",
* "_kind" : "tpAddress",
* "_kinds" : [ ]
* }
* ],
* "subdoc" : {
* "attr0" : "value"
* },
* "__v" : 0
* }
*/
With mongoose-mischema you have a powerfull tool to deal with your schemas, take care to use multiple inheritence only with orthogonal situations, that's all for now folks! Enjoy!
Walter Neto (@radixo)