概述
像Mysql和Mongodb這樣的數據庫,通常都是在命令行或者工具裏面進行操做,若是想在node搭建的服務器上面操做,就必需要利用特殊的模塊的。其中操做Mongodb數據庫須要用到mongoose模塊,下面記錄我學習mongoose模塊的過程,供之後開發時參考,相信對其餘人也有用。html
參考資料:mongoose文檔node
準備工做
須要先安裝MongDB數據庫和Node.js。sql
而後在npm裏面輸入以下命令:mongodb
//初始化 npm init //安裝mongoose依賴 npm install mongoose
鏈接數據庫
若是要操做數據庫,確定須要先鏈接數據庫(並不須要額外在mongdb數據庫裏面新建,若是node發現不存在這個數據庫會自動建立一個,可是須要先啓動mongodb服務):數據庫
// getting-started.js var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test');
而後用node運行getting-started.js便可鏈接到mongodb數據庫。可是上面的代碼並無作任何事,因此咱們須要加入以下代碼進行操做:npm
var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function (callback) { console.log('成功鏈接數據庫'); });
用node運行getting-started.js以後會在命令行打印「成功鏈接數據庫」,這就表示,以後全部的操做都必須在那個回調函數裏面寫。api
建立數據庫和條目
mongoose裏面的三個概念很重要:服務器
- schema,對應於mongodb裏面的collection(集合),在這裏定義鍵和類型(schematypes)。
- model,對應於schemas的一個類,經過它來建立條目。
- document,對應於mongodb裏面的entry,就是條目。
通常經過下面這個過程建立數據庫的條目:異步
//建立Schema var personSchema = mongoose.Schema({ name: String, height: Number }); //經過Schema建立model,因爲是類,因此首字母大寫 var PersonModel = mongoose.model('Person', personSchema); //建立document var tim = new PersonModel({ name: 'Tim', height: 150}); //保存(這是一個異步動做,回調會在同步代碼完畢後再運行) tim.save(function(err, tim) { console.log(tim.name + '保存成功'); }) //輸出tim console.log(tim);
注意:若是數據庫中有Person這個collection,則會自動鏈接到這個collection,不然會自動建立一個。mongoose
schema
對於schema,咱們能夠對它作三件事:增長或刪除鍵;定義主鍵;增長方法。
咱們能夠用add方法增長(刪除)鍵:
personSchema.add({ weight: 'number', nickname: 'string' });
能夠經過下面的示例感覺一下:
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function(callback) { console.log('開始進行MongoDB數據庫操做'); var personSchema = mongoose.Schema({ name: String, height: Number }); var PersonModel = mongoose.model('Person', personSchema); var tim = new PersonModel({ name: 'Tim', height: 150}); personSchema.add({ weight: 'number', nickname: 'string' }); var bim = new PersonModel({ name: 'bim', height: 160, weight: 60}); //輸出tim的名字 console.log(tim); //{_id: 5aed9a70595695188446035d, name: 'Tim', height: 150} console.log(bim); //{_id: 5aed9a70595695188446035e, name: 'Bim', height: 160, weight: 60} console.log(bim.nickname); //undefined });
從上面的例子能夠看到,沒有定義的屬性是undefined,而且不會輸出。咱們還能夠看到,有一個默認的屬性_id,它是schema的默認主鍵,若是想修改主鍵的話,能夠用下面的方法:
var personSchema = mongoose.Schema({ id: mongoose.Schema.ObjectId, name: String, height: Number }); var PersonModel = mongoose.model('Person', personSchema); var tim = new PersonModel({ id: new mongoose.Types.ObjectId, name: 'Tim', height: 150});
可是上面只是定義了一個類型爲ObjectId的主鍵而已,它會自動增長,可是它並非主鍵。mongodb不容許自定義主鍵(貌似是這樣?),可是能夠用虛擬鍵解決這個問題。
能夠經過下面的代碼給schema增長方法:
personSchema.methods.speak = function() { var greeting = this.name ? 'My name is ' + this.name : 'I have not a name'; console.log(greeting); } var PersonModel = mongoose.model('Person', personSchema); var tim = new PersonModel({ name: 'Tim', height: 150}); tim.speak();
model
model是建立條目的類,對於model咱們想作這幾件事:增刪改查。
增操做:利用model的create方法。(這個方法會自動保存條目)
PersonModel.create({name: sim}, function(err, person) { console.log('增長' + person.name); });
刪除操做:利用model的remove方法。
PersonModel.remove({name: Tim}, function(err) { console.log('刪除成功'); });
改操做:有不少種方法,可是全部方法都須要加一個回調函數,否則不會成功。
var condition = {name: 'bim'}, query = {$set:{name: 'time', nickname: 'haha'}}; //使用update方法 PersonModel.update(condition, query, function() { console.log('修改爲功'); }); //使用findOneAndUpdate方法 PersonModel.findOneAndUpdate(condition, query, function() { console.log('修改爲功'); });
查操做:利用model的find方法。
PersonModel.find({ name: 'bim' }, function(err, person){ console.log(person[0]); })
注意:增操做和改操做都是異步的,因此在增操做和改操做以後當即查詢是查不到的。
document
document就是條目entry,對於document咱們想對它作一些處理,好比進行回調等。
這個時候就能夠利用exec方法了,實例以下:
var query = PersonModel.findOne({ 'name': 'time' }); query.select('name nickname'); query.exec(function (err, person) { if (err) return handleError(err); //輸出:time is also called haha. console.log('%s is also called %s.', person.name, person.nickname) })