個人琴聲嗚咽,個人淚水全無。我把遠方的遠歸還草原。
- 海子《九月》html
什麼是Mongodb?
就是一個基於分佈式文件存儲的數據庫,多的不說。前端
mongodb分了多個版本,Atlas【雲版本】、Community Server【社區版本】、Enterprise Server【企業版本】......我選擇了社區版本安裝,Windows 7/Windows Server 2008 R2。version v3.4.0
下載地址: https://www.mongodb.com/downl...node
注意: 右上角紅框可選擇你想要的版本,分別爲穩定版、早期版、開發板,左上角可選擇對應版本集中的指定版本
可選擇zip/tgz/msi三種資源格式,zip和tgz下載以後解壓到對應目錄,還需配置對應的環境變量。msi爲安裝文件,無需再配置環境變量。【本人採用msi,方便】mongodb
安裝完成以後,在mongodb目錄下新建文件夾testMongodb
打開cmd,輸入數據庫
mongod --dbpath"D:\mongodb\testMongodb"
在瀏覽器訪問http://localhost:27017/
,顯示以下,說明你不只成功安裝了Mongodb還開啓了一個叫testMongodb的數據庫。
npm
總得來講,比起mySql,SOLserver用mongodb建立數據庫和啓動服務都簡單許多。它就像新建了一個文件夾,在文件夾中分類存放了許多txt文件。你能夠隨時增長或者刪除文件而不須要重啓服務。api
Robonmongo是一個免費的輕量級的mongodb用戶圖形界面(GUI)。
官網下載地址:https://robomongo.org/數組
右上角Download,會出現多個版本。每一個版本都有詳細的版本說明,可選擇一個你以爲合適的版本或者直接用最新版。瀏覽器
下載安裝以後,在打開mongodb服務的狀況下,輸入mongodb服務器地址,便可鏈接到服務器。安全
可對數據進行你想作的任何操做,操做都很簡單,這裏就略過了。
node操做mongodb有如下npm包:
mongoose、mongodb、mongoskin、mongojs(做者並未查到除此以外的npm包,但不表明沒有)。
哪個更好?我的見解僅供參考:
1.mongodb: 官方版,但寫起來太麻煩。 2.mongoskin:簡單,可是相關文檔太少,你甚至找不到實現聯表查詢的辦法 3.mongojs:比mongodb好一點,可是一樣文檔太少讓人極不滿意 4.mongoose:目前最好用的MongoDB ORM,文檔多(有官網),支持聯表查詢,並且還很規範
因此我選擇 mongoose。http://mongoosejs.com/
本節只講mongoose的基本概念和最基礎的項目搭建。CRUD(也就是增刪改查)的操做放在下一節。
安裝mongoose只須要install一下就行了
$ npm install mongoose --save
假設咱們已經開啓了一個testMongodb的mongodb服務,建立鏈接:
var mongoose = require('mongoose'); // 引入mongoose模塊 mongoose.connect('mongodb://localhost/testMongodb');// 鏈接到數據庫服務 var db = mongoose.connection;//connection建立鏈接的實例 db.on('error', console.error.bind(console, 'connection error:')); // 註冊鏈接失敗的事件監聽 db.once('open', function (callback) { // 註冊鏈接成功的事件監聽 once只觸發一次 // yay! });
once方法繼承自EventEmitter,EventEmitter是node事件觸發與事件監聽器功能的封裝
到此,testMongodb仍是一個空的數據庫,連表都沒有(爲了方便理解collections解釋爲表)。
要理解mongoose就要先理解下面三個名詞:
Schema: 一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力
Model:由Schema發佈生成的模型,具備抽象屬性和行爲的數據庫操做對
Entity:由Model建立的實體,他的操做也會影響數據庫
一句話歸納:用Schema建立一個數據庫表骨架,經過這個表骨架生成一個可操做的MOdel,這個Model能夠建立對應的實體Entity,Entity即一條可操做的數據,它們都是Object
便於理解可將Schema看作一張設計圖,MOdel是根據設計圖製造出來的模具,Entity就是模具作出來的物體。
定義一個Schema
var PersonSchema = new mongoose.Schema({ name:String //定義一個屬性name,類型爲String });
Schema.Type
Schema.Type是由Mongoose內定的一些數據類型,基本數據類型都在其中,他也內置了一些Mongoose特有的Schema.Type。支持自定義schema.type。
Schema.type有一下常見的類型:
//舉例: var ExampleSchema = new Schema({ name:String, binary:Buffer, //以字節的形式操做文件 living:Boolean, updated:Date, age:Number, mixed:Schema.Types.Mixed, //該混合類型等同於nested _id:Schema.Types.ObjectId, //主鍵 _fk:Schema.Types.ObjectId, //外鍵 array:[], arrOfString:[String], // 數據類型只能爲String的數組 下同 arrOfNumber:[Number], arrOfDate:[Date], arrOfBuffer:[Buffer], arrOfBoolean:[Boolean], arrOfMixed:[Schema.Types.Mixed], arrOfObjectId:[Schema.Types.ObjectId], nested:{ stuff:String, // 一個擁有具體屬性的對象 }, populate:{ type: String, ref: 'users' 用於支持populate查詢(聯表查詢) } });
Schema.Types.Mixed用戶定義可複用的數據格式,若是未定義則默認爲{}。
Schema.Types.Mixed = { name: String } var AnySchema = new Schema({any:Schema.Types.Mixed}); // 等於 var AnySchema = new Schema({any:{name: String}});
ObjectId是每一個Schema默認配置的主鍵屬性,屬性名爲_id,可本身定義一個_id來覆蓋此屬性。
Schema的擴展
Schema的擴支持爲其增長公共的實例方法和靜態方法,以便於Model和Entity的增刪改查等操做。
實例方法在生成對應的實例(Entity層)以後才能調用,而靜態方法在model層就可使用了。
實例方法
var PersonSchema = new Schema({name:String,type:String}); //查詢相似數據 PersonSchema.methods.findSimilarTypes = function(cb){ return this.model('Person').find({type:this.type},cb); }
使用
var PersonModel = mongoose.model('Person',PersonSchema); var krouky = new PersonModel({name:'krouky',type:'前端工程師'}); krouky.findSimilarTypes(function(err,persons){ //persons中就能查詢到其餘前端工程師 });
靜態方法:
PersonSchema.statics.findByName = function(name,cb){ this.find({name:new RegExp(name,'i'),cb}); } var PersonModel = mongoose.model('Person',PersonSchema); PersonModel.findByName('krouky',function(err,persons){ //找到全部名字叫krouky的人 });
Schema配置項
在new Schema();時,能夠追加一個配置項來配置Schema.
var config = { name: String, sex: String } var options = { safe: true, // 安全屬性 默認爲true strict: true,//嚴格配置(默認啓用),存入數據庫時,自動驗證 capped:1024,// 上線設置,限制一次操做的量 versionKey: '__v' // 版本鎖是Mongoose默認配置 autoIndex: '', //自動索引 } var ExampleSchema = new Schema(config,options);
Model模型,是通過Schema構造來的,除了Schema定義的數據庫骨架之外,還具備數據庫行爲模型,他至關於管理數據庫屬性、行爲的類。
//先建立Schema var TankSchema = new Schema({ name:'String', size:'String' }); //經過Schema建立Model var TankModel = mongoose.model('Tank',TankSchema);
有了對應的模型就能夠直接拿來操做數據庫
var tank = {'something',size:'small'}; TankModel.create(tank);
Entity是model的實例,根據model建立出來的Entity並無存入數據庫,須要調用Entity的save方法來儲存。
Entity不具有Model的方法,因此只能用本身的方法。
須要注意的是,在新版本的mongoose文檔中,Entity爲Documents。
//經過Model建立Entity var tankEntity = new TankModel('someother','size:big'); tankEntity.save();
限於篇幅,本小節暫時寫到這裏。下一節再詳細講解query,Validation,Middleware等更加高級的操做。
參考文章:
http://mongoosejs.com/docs/ap...
http://www.runoob.com/mongodb...
http://ourjs.com/detail/53ad2...
https://cnodejs.org/topic/548...
https://www.cnblogs.com/jaxu/...