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

相关文章
相关标签/搜索