Defining a Model

Though its trite as hell we'll be starting with a users collection. If it helps assume all your users are hot chicks and superheros. var mongoose = require('mongoose'); var db = require('./db'); //var address = require('./address'); /** * NOTE: username stored in _id * @TODO: salted password "double blind" encryption */ var db = require('./db'); db.init; module.exports = { _schema: null, _schema_def: { _id: String , name: String , password: {type: String, required: true} , validated: {type: Boolean, default: false} , email: String , roles: [String] , cans: [String]    // a denormalized list of things this user can do derived from aggreate of roles , notes: [String] //, 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, /**     * note - a lot of "find" type functions of model are *       static functions of the model object. *       If you want to create a new record, save it, etc. *       call model(true) and treat the result as an activeRecord. */    model: function(new_instance){ if (!module.exports._model){ var schema = module.exports.schema; //  console.log('schema for users'); //  console.log(schema); mongoose.model('Users', schema); module.exports._model = mongoose.model('Users'); }        return new_instance ? new module.exports._model : module.exports._model; },    authenticate: function(id, password, callback){ var m = module.exports.model; m.findOne({_id: id, password: password}, callback); // not checking password yet } } That being done lets take a look.

The only outwardly important method is model.

Model returns one of two possible results - its overloaded. With no parameters it returns the raw model; this is an object that you can use to find data from, etc. its effctively a "table" class. This is used in the authenticate method of the user module.

If you call model(true) it returns an active record that you can use to create a new record as in: var user_module = require('./../model/user'); var new_user = user_module.model; // assume you are sure that the username "bill" has not been taken yet new_user._id = "bill"; new_user.password = "Folger$"; new_user.save(function(err, result){ // and go on. }); Another takeaway from this example: while _id is by default an object with a hashed value, in Mongo - and in Mongoose this is not the ONLY valid type for a Mongo _id - if you have a specific and unique key for a dataset - and a username is definately one of those - then it makes a lovely key and in that case this is what we have done.