vue2.0開發聊天程序(六) 搞定mongodb

個人琴聲嗚咽,個人淚水全無。我把遠方的遠歸還草原。
                   - 海子《九月》html

mongodb安裝

什麼是Mongodb?
就是一個基於分佈式文件存儲的數據庫,多的不說。前端

mongodb分了多個版本,Atlas【雲版本】、Community Server【社區版本】、Enterprise Server【企業版本】......我選擇了社區版本安裝,Windows 7/Windows Server 2008 R2version 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

Robonmongo是一個免費的輕量級的mongodb用戶圖形界面(GUI)。
官網下載地址:https://robomongo.org/數組

圖片描述

右上角Download,會出現多個版本。每一個版本都有詳細的版本說明,可選擇一個你以爲合適的版本或者直接用最新版。瀏覽器

圖片描述

下載安裝以後,在打開mongodb服務的狀況下,輸入mongodb服務器地址,便可鏈接到服務器。安全

圖片描述

clipboard.png

可對數據進行你想作的任何操做,操做都很簡單,這裏就略過了

Node鏈接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簡單搭建

本節只講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

要理解mongoose就要先理解下面三個名詞:
Schema: 一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力
Model:由Schema發佈生成的模型,具備抽象屬性和行爲的數據庫操做對
Entity:由Model建立的實體,他的操做也會影響數據庫

一句話歸納:用Schema建立一個數據庫表骨架,經過這個表骨架生成一個可操做的MOdel,這個Model能夠建立對應的實體Entity,Entity即一條可操做的數據,它們都是Object

便於理解可將Schema看作一張設計圖,MOdel是根據設計圖製造出來的模具,Entity就是模具作出來的物體。

Schema

定義一個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

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

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/...

相關文章
相關標籤/搜索