В тази публикация ще ви покажем как да използвате Mongoose за внедряването на MongoDB, за да създадете по-просто, базирано на схеми решение за моделиране на данните от приложението си.
Какво е Mongoose?
Mongoose е „елегантно моделиране на обекти MongoDB за Node.js “. Ако сте използвали MongoDB преди и сте опитвали основни операции с база данни, може да сте забелязали, че MongoDB е „без схема“. Когато искате да внедрите по-структурирана база данни и искате да използвате силата на MongoDB, Mongoose е един от ODM (O обектD атаМ apping) решения.
За да демонстрирате бързо, изпълнявате команда за вмъкване в колекция с име потребители по следния начин:
db.users.insert({ name :'Arvind', gender :'male'});
И веднага след това можете да стартирате:
db.users.insert({ име :'Арвинд', пол :'мъж', парола :'!@#$'});
и MongoDB никога няма да се оплаква от вариациите в броя на колоните (двойки ключ-стойност). Това е много гъвкаво. Но когато искате да запазите данните си по-организирани и структурирани, ще трябва да поддържате това във вашия сървърен код, като напишете валидиране, като се уверите, че нищо нерелевантно не се съхранява в колекция. Това е мястото, където Mongoose прави живота лесен.
„Mongoose предоставя директно, базирано на схема решение за моделиране на данните на вашето приложение и включва вградено привеждане на типа, валидиране, изграждане на заявки, куки за бизнес логика и други , извън кутията.”
Инсталирайте Node.js и MongoDB
За да използваме Mongoose, трябва да имаме инсталиран Node.js. Можете да намерите информация тук.
Започнете да разработвате
Първо, нека създадем малка детска площадка, където да се забавляваме. Създайте нова папка с име myMongooseApp и отворете терминал/подкана тук и стартирайте:
npm init
Това ще ни помогне да инициализираме нов проект за възел. Напълнете го според нуждите. След това ще инсталираме Mongoose като зависимост към нашия проект. Пусни:
npm инсталира mongoose --save-dev
След това стартирайте услугата MongoDB, като изпълните:
mongod
След това създайте нов файл с име index.js в корена и след това го отворете в любимия си редактор. Добавете кода по-долу:
var mongoose =require('mongoose');mongoose.connect('mongodb://localhost/myTestDB');var db =mongoose.connection;db.on('error', function (err) {console. log('грешка при свързване', err);});db.once('open', function () {console.log('connected.');});
Тук изискваме пакетът Mongoose да се свърже с базата данни и да инициализира връзката. Името на нашата база данни е myTestDB.
След това стартирайте:
node index.js
Сега трябва да видите свързаното съобщение. Можете също да използвате пакет на възел с име nodemon за автоматично рестартиране на сървъра на възли при промени.
Сега нашата пясъчна кутия е готова за игра!
Схеми мангусти
Схемите са като скелети, голите кости на това как ще изглежда вашата колекция от данни. Ако имате работа с колекция от потребители, вашата схема ще изглежда така:
Име - StringAge - NumberGender - String Дата на раждане - Дата
Ако имате работа с колекция от продукти, вашата схема ще изглежда така:
SKU - StringName - StringPrice - NumberInStock - BooleanQuantity - Number
Можете да видите отклонението. Когато нашите данни са защитени със схема като тази, възможността за съхранение на данни за боклук намалява драстично.
Сега, когато разбрахме схемите, нека се опитаме да изградим потребителска схема с помощта на Mongoose. Върнете се към index.js и добавете следния код:
var Schema =mongoose.Schema;var userSchema =new Schema({name :String,age :Number,DOB :Date,isAlive :Boolean});
Намерете основни полета, свързани с потребителите, и техните типове схеми тук.
След това ще създадем модел от схемата. Добавете:
var User =mongoose.model('User', userSchema);
Това е, нашият потребителски модел е готов! Ще използваме това като основна схема за вмъкване на потребители в базата данни. По този начин знаем, че всеки документ в потребителска колекция ще има полетата, изброени в схемата. Нека създадем нов потребителски екземпляр и да го запишем в DB. Добавете:
var arvind =нов потребител({name :'Arvind',age :99,DOB :'01/01/1915',isAlive :true});arvind.save(function (err, data) {if (err ) console.log(err);else console.log('Saved :', data );});
Трябва да видите нещо подобно:
Запазено:{ __v:0,name:'Arvind',age:99,DOB:пт, 01 януари 1915 00:00:00 GMT+0530 (IST),isAlive:true,_id:536a4866dba434390d728216 .Без проблеми, без проблеми. Прост и лесен API за взаимодействие с модели.
Да приемем, че искаме всеки модел да има метод с име isYounger. Този метод ще върне true, ако възрастта е по-малка от 50 години, и false, ако е по-голяма. Можем да направим това, като запитаме базата данни за текущия потребител, след което проверим обуславянето и връщането на истина или лъжа.
Но какво ще стане, ако искаме да приложим този метод към всички модели на потребителската схема? Ето как го правим в Mongoose:
var mongoose =require('mongoose');mongoose.connect('mongodb://localhost/myTestDB');var db =mongoose.connection;db.on('error', function (err) {console. log('connection error', err);});db.once('open', function () {console.log('connected.');});var Schema =mongoose.Schema;var userSchema =нова схема ({name :String,age :Number,DOB :Date,isAlive :Boolean});userSchema.methods.isYounger =function () {return this.model('User').age <50 ? true :false;}var User =mongoose.model('User', userSchema);var arvind =new User({name :'Arvind',age :99,DOB :'01/01/1915',isAlive :true} );arvind.save(функция (err, data) {if (err) console.log(err);else console.log('Saved', data );});console.log('isYounger :',arvind. е по-млад());На ред 21 добавяме дефиницията на метода и резултатът на ред 39 ще бъде false. Това е прост и удобен начин за добавяне на методи към вашата схема, правейки я по-обектно-ориентирана.
В случай, че имате поле за парола, можете да добавите метод като encryptPassword(), за шифроване на парола и comparePassword(), за да сравните паролите при влизане със самата userSchema. Можете да прочетете повече за удостоверяването с парола тук.
Извън кутията Mongoose също предоставя няколко опции при създаването на схемата. Например, ако погледнете декларацията на схемата по-долу, ние предаваме опция strict:false:
var userSchema =new Schema({name :String,age :Number,DOB :Date,isAlive :Boolean}, {strict :false});Строговата опция е вярна по подразбиране и не позволява запазването на двойките ключ-стойност „не-схема“. Например, това ще бъде запазено:
var arvind =нов потребител({name :'Arvind',age :99,DOB :'01/01/1915',isAlive :true});Като има предвид:
var arvind =нов потребител({name :'Arvind',age :99,DOB :'01/01/1915',isAlive :true,bucketList :[{...}, {...}, { ...} ]});Всичко по-горе ще бъде запазено минус масива bucketList, защото не е деклариран като част от схемата. Така че нито един клиент, който използва вашите услуги, няма да може да изхвърли невалидни данни във вашите колекции.
Друга страхотна опция е колекцията. Ако не искате името на вашия модел да е същото като името на колекцията, можете да подадете името като опция като:
var userSchema =new Schema({name :String,age :Number,DOB :Date,isAlive :Boolean}, {collection :'appusers'});Можете да намерите списък с други опции тук.
С Mongoose можете също да добавяте събития към вашите схеми като предварително или след запазване, където можете да извършвате валидации, да обработвате данни или да изпълнявате други заявки в съответните събития. Тези методи се наричат Middlewares.
Прост пример може да бъде паралелен междинен софтуер като:
var userSchema =new Schema({name :String,age :Number,DOB :Date,isAlive :Boolean})schema.pre('save', true, function (next, done) {// извикването на next започва следващият междинен софтуер в parallelnext();doAsync(done);});Можете да прочетете повече за междинния софтуер тук. В следващата ни публикация ще говорим повече за използването на Yeoman за автоматично генериране на скеле за вашите MongoDB проекти.
Благодаря за четенето. Коментирайте.
@arvindr21