diff options
Diffstat (limited to 'node_modules/mongoose/docs/model-definition.md')
| -rw-r--r-- | node_modules/mongoose/docs/model-definition.md | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/node_modules/mongoose/docs/model-definition.md b/node_modules/mongoose/docs/model-definition.md new file mode 100644 index 0000000..69700ff --- /dev/null +++ b/node_modules/mongoose/docs/model-definition.md @@ -0,0 +1,142 @@ +Defining a model +================ + +Models are defined by passing a `Schema` instance to `mongoose.model`. + + mongoose.model('MyModel', mySchema); + // mySchema is <a Schema> + +You can easily access the `Schema` constructor from the `mongoose` singleton: + + var mongoose = require('mongoose') + , Schema = mongoose.Schema; + + var mySchema = new Schema({ + // my props + }); + +Models are then accessed from `mongoose` if you want to use a single +connection: + + // connect the `mongoose` instance + mongoose.connect('mongodb://host/db'); + + var BlogPost = mongoose.model('BlogPost'); + +Or from a `Connection` instance if you want to use multiple +databases/connections: + + var db = mongoose.createConnection('mongodb://host/db') + , BlogPost = db.model('BlogPost'); + +**Important**: the actual interaction with the data happens with the `Model` +that you obtain through `mongoose.model` or `db.model`. That's the object that +you can instantiate or that you can call `.find()`, `.findOne()`, etc upon. +Don't confuse schemas and actual models! + +## Defining your keys + +The `Schema` constructor receives an object representation of your schemas as +its first parameter. If you want to add more keys later, `Schema#add` provides +the same functionality. + +Your schema is constructed by passing all the +JavaScript natives that you know (String, Number, Date, Buffer) as well +as others exclusive to MongoDb (for example `Schema.ObjectId`). For details on all +SchemaTypes see the [Schema Type chapter](/docs/schematypes.html). + + var ObjectId = Schema.ObjectId; + + var PostSchema = new Schema({ + owner : ObjectId + , title : String + , date : Date + }); + +### Defining documents within documents + +To define an array of documents that follows a certain schema, make the value +an array with the schema constructor inside. + +For example, let's assume we want to have a collection of comments within a +blogpost, and we want them to be subject to casting, validation, and other +functionality provided by models: + + var Comment = new Schema({ + body : String + , date : Date + }); + + var Post = new Schema({ + title : String + , comments : [Comment] + }); + +This will allow you to interact very easily with subdocuments later on. For +more information, refer to the chapter on +[embedded documents](/docs/embedded-documents.html). + +### Defining custom options for keys + +Each key that you define is internally mapped to a `SchemaType`. Bear in mind, a +Schema is not something that you interact directly with, but it's a way to +describe to Mongoose what your want your data to look like, and how you want +it to behave. + +`SchemaType`s take care of validation, casting, defaults, and other general +options. Some functionality is exclusive to certain types of `SchemaType`s, for +example only numbers support `min` and `max` values. + +In order to customize some of these options directly from the definition of +your model, set your key to an object with the format `{ type: Type, ... }`. + + var Person = new Schema({ + title : { type: String, required: true } + , age : { type: Number, min: 5, max: 20 } + , meta : { + likes : [String] + , birth : { type: Date, default: Date.now } + } + }); + +Those options are functions that are called on each SchemaType. +If you want to define options later on, you could access a certain key through +the `path` function: + + Person.path('age').max(400); + + Person.path('meta.birth').set(function (v) { + // this is a setter + }); + + Person.path('title').validate(function (v) { + return v.length > 50; + }); + +Some of the options are versatile. `default` takes a `Function` or a value. +`validate` takes a `Function` or a `RegExp`. More information on these can be +found in the [Schema Type chapter](/docs/schematypes.html). + +## Beyond keys: Middleware + +Middleware are special user-defined functions that are called transparently +when certain native methods are called on `Document` instances (`init`, `save` +and `remove`). + +Let's say that you want to email a certain user when his document changes. +You'd then define a hook on the User schema like this: + + User.pre('save', function (next) { + email(this.email, 'Your record has changed'); + next(); + }); + +More information about the specifics of middleware can be found [here](/docs/middleware.html). + +## Instance Methods and Static methods + +For details about defining your own custom static and instance methods read [this](/docs/methods-statics.html). + +## Plugins + +Schemas also support plugins. Read more about it on the [Plugins](/docs/plugins.html) page. |
