Where Mongoose starts to get fun is with nested schemas. Say you have robots made of various parts. You can define a Parts schema and nest it inside your robots schema. Note that you can't, say, create five or six different schemae and slot it into a single field - no polymorphism here.
var mongoose = require('mongoose'); var db = require('./db'); var parts_module = require('./parts'); module.exports = { _schema: null, _schema_def: { _id: String , name: String , parts: [parts_model.schema()] //, address: address.schema() }, schema: function(){ if (!module.exports._schema){ module.exports._schema = new mongoose.Schema(module.exports._schema_def); } return module.exports._schema; }, _model: null, model: function(new_instance){ if (!module.exports._model){ var schema = module.exports.schema(); // console.log('schema for users'); // console.log(schema); mongoose.model('Robots', schema); module.exports._model = mongoose.model('Robots'); } return new_instance ? new module.exports._model() : module.exports._model; } }
... and here is the parts model.
var mongoose = require('mongoose'); module.exports = { _schema: null, _schema_def: { _id: String , name: String , weight: Number , part_number: String }, schema: function(){ if (!module.exports._schema){ module.exports._schema = new mongoose.Schema(module.exports._schema_def); } return module.exports._schema; }, _model: null, model: function(new_instance){ if (!module.exports._model){ var schema = module.exports.schema(); // note- mongoose.model('RobotParts', schema); module.exports._model = mongoose.model('RobotParts'); } return new_instance ? new module.exports._model() : module.exports._model; } }
Note that - for completeness' sake - I provide model methods for my parts model, the point of this module is to provide a schema for robots to use - I don't intend to store robot parts outside of the robots collection.
Since the parts schema is nested you don't have to do any activerecord schenanigans with it - you can just pass it objects and Mongoose will cast them nicely.
var robot_module = require('./../model/robot'); var robot = robot_module.model(true); robot.parts = [{part_number: 1415, name: 'Laser Gun', weight: 15}, {part_number: 214526, name: 'treadmill', weight: 2000} ... ]; robot.save();