个人琴声呜咽,个人泪水全无。我把远方的远归还草原。
- 海子《九月》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/...