我的琴声呜咽,我的泪水全无。我把远方的远归还草原。
- 海子《九月》
mongodb安装
什么是Mongodb?
就是一个基于分布式文件存储的数据库,多的不说。
mongodb分了多个版本,Atlas【云版本】、Community Server【社区版本】、Enterprise Server【企业版本】......我选择了社区版本安装,Windows 7/Windows Server 2008 R2。version 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服务器地址,即可连接到服务器。
可对数据进行你想做的任何操作,操作都很简单,这里就略过了。
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/...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。