Mongoose – это ORM для MongoDb сделанная под node.js.
Традиционно начнем разбор с создания песочницы.
Mongoose устанавливается как модуль к node.js:
$ npm install mongoose
После установки проверяем подключается ли модуль, пишем в test.js файлик следующий код:
var mongoose = require('mongoose'); console.log(mongoose.version);
и если все прошло успешно, то должно выдать текущую версию mongoose.
Чтобы подключится к базе, создаем соединение:
var db = mongoose.createConnection('mongodb://localhost/test'); //общий синтаксис метода createConnection выглядит слудеющим образом: //mongoose.connect('mongodb://username:password@host:port/database').
и открываем его:
db.on("error", console.error.bind(console, "connection error:")); db.once("open", function callback () { console.log("Connected!") });
В mongoose все завязано на 2х ключевых понятиях Схема(Schema) – описание сущности и Модель – сама сущность.
Создадим схему для комментариев:
var UserSchema = new mongoose.Schema( { name: { type: String, default: "hahaha" }, age: { type: Number, min: 18, index: true }, bio: { type: String, match: /[a-z]/ }, date: { type: Date }, buff: Buffer } );
Каждое поле карактеризуется типом SchemaTypes и может иметь дополнительные характеристики: default, min и max(для Number), match и enum(для String), index и unique(для индексов).
Подробнее о типах можно почитать тут.
Теперь создадим модель по схеме:
var User = db.model("User",UserSchema)
и экземпляр для данной модели:
var newUser = new User({ name: "Alice", age: 21})
мы можем расширить схему методами:
UserSchema.methods.speak = function () { var greeting = this.name ? "My name is " + this.name : "I don't have a name" console.log(greeting); } var User = db.model("User",UserSchema) var newUser = new User({ name: "Alice", age: 21}) newUser.speak();
Чтобы сохранить нашего пользователя в базу, мы должны вызвать метод save:
newUser.save(function (err, newUser) { if (err){ console.log("Something goes wrong with user " + newUser.name); }else{ newUser.speak(); } });
Посмотреть что мы насохраняли в базу и вывести записи для конкретной коллекции(модели) можно так:
User.find(function (err, users) { console.log(users) })
если нам необходимо добавить условие для выборки, тогда так:
User.find({ name: /^Al/ }, function (err, users) { console.log(users) })
// также существует метод findById
Кроме обычных методов схема позволяет добавлять сеттеры и геттеры (магические методы):
UserSchema.path("name").set( function( name ) { //capitalize return name.charAt(0).toUpperCase() + name.slice(1); });
var newUser = new User({ name: "alice"}) // name will be capitalize
Кроме set мы еще можем задать get и default магические методы.
Также схема позволяет на каждый метод повесить триггер с колбэком, который будет выполнен до выполенения самого метода. Такой удобный механизм, который позволяет избежать большой вложенности, в MongoDb называется Middleware.
Реализуется следующим образом:
someSchema.pre(methodName, function (next, methodArg1, methodArg2, ...) { // ... })
как пример возмем метод save:
UserSchema.pre( "save", function( next ) { // do stuff next(); } );
по next() запускается следующий триггер.
Используя данный подход мы можем организовать механизм вызова и передачи ошибок:
UserSchema.pre('save', function (next) { // something goes wrong next(new Error('something went wrong')); });
// later... newUser.save(function (err) { // err can come from a middleware });
Также с помощью Middleware можно делать:
- сложную валидацию
- удаление документов по зависимостям
- вызов кастомизированых событий
- нотификейшены