2

我的琴声呜咽,我的泪水全无。我把远方的远归还草原。
                   - 海子《九月》

mongodb安装

什么是Mongodb?
就是一个基于分布式文件存储的数据库,多的不说。

mongodb分了多个版本,Atlas【云版本】、Community Server【社区版本】、Enterprise Server【企业版本】......我选择了社区版本安装,Windows 7/Windows Server 2008 R2version v3.4.0
下载地址: https://www.mongodb.com/downl...

图片描述

注意: 右上角红框可选择你想要的版本,分别为稳定版、早期版、开发板,左上角可选择对应版本集中的指定版本
可选择zip/tgz/msi三种资源格式,zip和tgz下载之后解压到对应目录,还需配置对应的环境变量。msi为安装文件,无需再配置环境变量。【本人采用msi,方便】

运行

安装完成之后,在mongodb目录下新建文件夹testMongodb打开cmd,输入

mongod --dbpath"D:\mongodb\testMongodb"  

在浏览器访问http://localhost:27017/,显示如下,说明你不仅成功安装了Mongodb还开启了一个叫testMongodb的数据库。
图片描述

总得来说,比起mySql,SOLserver用mongodb创建数据库和启动服务都简单许多。它就像新建了一个文件夹,在文件夹中分类存放了许多txt文件。你可以随时增加或者删除文件而不需要重启服务。

可视化界面工具 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/...


ermu
500 声望117 粉丝

不行啊,要上班