mongoose
Version:
Mongoose MongoDB ODM
149 lines (98 loc) • 4.48 kB
Markdown
Migrating from v1.x to 2.x
==========================
Migrating from __v1.x__ to __2.x__ brings with it a few changes to be aware of.
## Auto-reconnect
Previously the `auto_reconnect` option of the node-mongodb-driver
defaulted to false. It now defaults to true so if your connection drops
while your app is running the driver will continue retrying until it
can connect again.
## Private props
Several internal instance props have had name changes so its more obvious that
they are not intended for public use. Namely `instance.doc` has changed
to `instance._doc` since it contains the structure Mongoose relies on
to operate properly and should only be manipulated with caution.
Here are the relavent changes:
var thing = new Thing;
thing.doc -> thing._doc
thing.activePaths -> thing._activePaths
thing.saveError -> thing._saveError
thing.validationError -> thing._validationError
## Circular refs in getters
Previously Mongoose exibited very odd behavior with getters:
toy.color.color.color.color ... // actually worked!
Obviously this was wrong and has now been fixed.
toy.color.color // undefined
## Getter / Setter scope
Nested getter/setter scopes were set incorrectly since version 1.7 or so.
This has been fixed. In your getter/setter, `this` now properly refers
to the instance.
var SongSchema = new Schema({
title: String
, detail: {
format: String
}
});
SongSchema.path('detail.format').get(function () {
console.log(this !== this.detail) // true, used to be false
});
You may not have noticed this bug since the circular getters previously
masked (_mostly_) this bad behavior.
## Setters application
Setters are no longer applied when the doc returns from the db (bug). It
caused problems for folks trying to use setters for passwords / salts
resulting in doubly hashed passwords after queries.
UserSchema.path('password').set(function (val) {
// now only runs when you change `user.password`
// not when the doc returns from the db
});
## Query#bind
If you were using the `Query` object directly and calling its `bind`
method, the v1.x behavior cloned the query and returned the
new one. This is no longer the case. The query is now simply
bound and returns itself.
## Multiple collection support removed
In 1.x Mongoose had support for multiple collection names per model. This
was an edge case and support for it has been removed.
## Compat.js removed
Backward compatibility with verions 0.x has been removed.
require('mongoose').compat = true // no longer does anything
## Utils.erase removed
We removed utils.erase since it was unused in the project. If you were
using it you'll need to copy it from the 1.x branch into your own.
## Error handling
Previously, the error returned after failed validation contained an `errors`
object which was a hash of path keys to error message values.
Now the Error returned is more helpful. Instead of the `errors`
object containing string values it holds the actual
ValidatorError. Each ValidatorError has a `type` and `path` property
providing us with a little more error handling flexibility.
var ToySchema = new Schema({
color: String
, name: String
});
var Toy = db.model('Toy', ToySchema);
Toy.schema.path('name').validate(function (value) {
return /blue|green|white|red|orange|periwinkel/i.test(value);
}, 'Invalid color');
var toy = new Toy({ color: 'grease'});
toy.save(function (err) {
// previous behavior (v1x):
console.log(err.errors.color)
// prints 'Validator "Invalid color" failed for path color'
// new v2x behavior - err.errors.color is a ValidatorError object
console.log(err.errors.color.message)
// prints 'Validator "Invalid color" failed for path color'
// you can get v1 behavior back by casting error.color toString
console.log(String(err.errors.color))
// prints 'Validator "Invalid color" failed for path color'
console.log(err.errors.color.type);
// prints "Invalid color"
console.log(err.errors.color.path)
// prints "color"
console.log(err.name)
// prints "ValidationError"
console.log(err.message)
// prints "Validation failed"
});
BTW, the `err.errors` object is also available on the model instance.
toy.errors.color.message === err.errors.color.message