Schema Types ============ `SchemaType`s take care of validation, casting, defaults, and other general options in our models. We can specify our types one of two ways: // directly without options var Person = new Schema({ title : String }); // or with options var Person = new Schema({ title : { type: String, lowercase: true } }); In the example above we specified the `lowercase` option for strings which will lowercase the string whenever it is set. Options are functions that are called on each SchemaType. Each `SchemaType` has its own set of custom options. ## Available Schema Types ### String - `lowercase`: {Boolean} Creates a setter which calls `.toLowerCase()` on the value - `uppercase`: {Boolean} Creates a setter which calls `.toUpperCase()` on the value - `trim`: {Boolean} Creates a setter which calls `.trim()` on the value - `match`: {RegExp} Creates a RegExp based [validator](/docs/validation.html). The value being set is `.test()`ed against the RegExp. If it does not pass, validation will fail. - `enum`: {Array} Creates an enum validator. If the value being set is not in this array, validation will fail. ### Number - `min`: {Number} Creates a validator which checks that the value being set is not less than the value specified. - `max`: {Number} Creates a validator which checks that the value being set is not greater than the value specified. ### Date - no custom options ### Boolean - no custom options ### Buffer (v2.x only) - no custom options ### ObjectId To specify a type of `ObjectId`, use `Schema.ObjectId` in your declaration. var mongoose = require('mongoose'); var Schema = mongoose.Schema; var Car = new Schema({ driver: Schema.ObjectId }) - no custom options ### Mixed An "anything goes" `SchemaType`, its flexibility comes at a trade-off of it being harder to maintain. `Mixed` is available either through `Schema.Types.Mixed` or by passing an empty object literal. The following are equivalent: var Any = new Schema({ any: {} }); var Any = new Schema({ any: Schema.Types.Mixed }); Since it is a schema-less type, you can change the value to anything else you like, but Mongoose loses the ability to auto detect/save those changes. To "tell" Mongoose that the value of a `Mixed` type has changed, call the `.markModified(path)` method of the document passing the path to the `Mixed` type you just changed. person.anything = { x: [3, 4, { y: "changed" }] }; person.markModified('anything'); person.save(); // anything will now get saved - no custom options ### Array Creates an array of `SchemaTypes` or [Embedded Documents](/docs/embedded-documents.html). var ToySchema = new Schema({ name: String }); var ToyBox = new Schema({ toys: [ToySchema] , buffers: [Buffer] , string: [String] , numbers: [Number] ... etc }); Note: specifying an empty array is equivalent to `[Mixed]`. The following all create arrays of `Mixed`: var Empty1 = new Schema({ any: [] }); var Empty2 = new Schema({ any: Array }); var Empty3 = new Schema({ any: [Schema.Types.Mixed] }); var Empty4 = new Schema({ any: [{}] }); - no custom options ## Additional options Besides the options listed above, all SchemaTypes share the following additional options. - `default`: {Function|value} - Determines the default value for the path. All values are casted. If using a function, the value it returns will be casted as the default value. - `required`: {Boolean} - If true, creates a validation rule requiring this path be set before saving occurs. - `get`: {Function} - Adds a getter for this path. See the [getters / setters](/docs/getters-setters.html) docs for more detail. - `set`: {Function} - Adds a setter for this path. See the [getters / setters](/docs/getters-setters.html) docs for more detail. - `index`: {Boolean|Object} - Tells Mongoose to ensure an index is created for this path. An object can be passed as well. var Person = new Schema({ name: String, index: true }) var Person = new Schema({ name: String, index: { unique: true }}) Note: indexes cannot be created for `Buffer` `SchemaTypes`.
Note: if the index already exists on the db, it will _not_ be replaced. - `unique`: {Boolean} - Tells Mongoose to ensure a unique index is created for this path. The following are equivalent: var Person = new Schema({ name: String, unique: true }) var Person = new Schema({ name: String, index: { unique: true }}) Note: indexes cannot be created for `Buffer` `SchemaTypes`.
Note: if the index already exists on the db, it will _not_ be replaced. - `sparse`: {Boolean} - Tells Mongoose to ensure a sparse index is created for this path. The following are equivalent: var Person = new Schema({ name: String, sparse: true }) var Person = new Schema({ name: String, index: { sparse: true }}) Note: indexes cannot be created for `Buffer` `SchemaTypes`.
Note: if the index already exists on the db, it will _not_ be replaced. - `validate`: {Function|RegExp|Array} - Creates a [validator](/docs/validation.html) for this path. // passing a function function hasNumber (v) { return v.length && /\d/.test(v); } var Person = new Schema({ street: String, validate: hasNumber }); // passing a RegExp var Person = new Schema({ street: String, validate: /\d/ }); // passing an array var Person = new Schema({ street: String, validate: [hasNumber, 'street number required'] }); // or var Person = new Schema({ street: String, validate: [/\d/, 'street number required'] }); For more detail about validation including async validation, see the [validation](/docs/validation.html) page. ## Alternate options definition Instead of defining options when instanciating your `Schema` we can also access keys through the `path` function and add options there: 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; });