mogoosephp
schema---模式定义,堆数据库字段的类型进行定义【string,int,float】mysql
var mongoose = require('mongoose'); // 顶会议用户组件 // 建立模型 var Schema = mongoose.Schema; var userScheMa = new Schema({ userid: String, password: String });
Model---编译模型sql
经过模式构造而来mongodb
Document---文档实例化数据库
1. 链接数据库异步
var mongoose = require("mongoose"); // 链接字符串格式为mongodb://主机/数据库名 mongoose.connect('mongodb://localhost/test');
2. 存储数据mongoose
var Schema = mongoose.Schema; //骨架模版 var movieSchema = new Schema({ doctor : String, title : String, language : String, country : String, year : Number, summary : String, poster : String, flash : String }) //模型 var Movie = mongoose.model('Movie', movieSchema); //存储数据 var moive = new Movie({ title: '黑衣人三', doctor: '史密斯', year: 2018, flash: 'http://player.youku.com/player.php/sid/XNjA1Njc0NTUy/v.swf', country: '美国', language: '英语', summary: '好片' }) //保存数据库 moive.save(function(err) { if (err) { console.log('保存失败') return; } console.log('meow'); });
以上是最简单的数据操做了post
流程就是:经过Schema建立一个模式movieSchema ,经过模式movieSchema建立一个模型Movie,经过模型Movie写入数据,经过save方法保存性能
定义schema->建立model->实例化方法ui
表 –》 合集 –》 文档
这里涉及几个名词概念Schema与Model
3.Schema与
Model
虽然模式(Schema)在MongoDB的存储中并非必须的,可是通常来讲为了文档的整齐一致咱们在Mongoose中仍是会用到模式。能够说,Mongoose中的一切都从定义模式开
不像传统的关系型数据库同样,好比mysql,链接好数据后直接有把sql语句丢到一个指定的方法中就执行了,这里会有Schema的抽象概念
Schema它相似于关系数据库的表结构,能够理解为数据库模型骨架
Schema能够看做工厂中模具同样,比如一个茶杯,喝水是茶杯最终的功能,茶杯自己就像是Model,那么茶杯的批量生产是须要靠工厂的模具成型的,这就像是Schema了
Schema不只定义了文档结构和使用性能,还能够有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子
Schema
生成Model
4. CURD操做
Model能够看到关系型数据库中的表,那么经过new Model出来的实例document文档对应的则是关系数据库中表的一行记录
document有许多内置的实例方法. 能够直接执行增删改查操做
增长数据
//模型var Movie = mongoose.model('Movie', movieSchema);
var moive = new Movie({ title: '黑衣人三', doctor: '史密斯', year: 2018, flash: 'http://player.youku.com/player.php/sid/XNjA1Njc0NTUy/v.swf', country: '美国', language: '英语', summary: '好片' }) //保存数据库 moive.save(function(err) { if (err) { console.log('保存失败') return; } console.log('meow'); });
在这里咱们经过对模型Movie实例化生成了一个叫moive的文档,并使用save方法将它存储到了集合
修改数据
User.update({_id: oneUser._id}, { $set: {name: oneUser.name,password:oneUser.password} }, function(err) { if(err){ console.log(err) return } console.log('更新成功') });
更新的数据比较少用$set,可用性仍是很好
删除数据
User.remove({ _id: id }, function(err) { if (err) { console.log(err) return } console.log('删除成功') });
Document
是与MongoDB
文档一一对应的模型,Document
可等同于Entity
,具备属性和操做性
注意:
Document
的`CRUD都必须通过严格验证的,参看2.5.2 Schema的strict严格配置
查询内容过多,专题讲解
有许多方式来更新文件,如下是经常使用的传统方式:
PersonModel.findById(id,function(err,person){ person.name = 'MDragon'; person.save(function(err){}); });
这里,利用Model
模型查询到了person
对象,该对象属于Entity
,能够有save操做,若是使用
Model`操做,需注意:
PersonModel.findById(id,function(err,person){ person.name = 'MDragon'; var _id = person._id; //须要取出主键_id delete person._id; //再将其删除 PersonModel.update({_id:_id},person,function(err){}); //此时才能用Model操做,不然报错 });
update
第一个参数是查询条件,第二个参数是更新的对象,但不能更新主键,这就是为何要删除主键的缘由。
固然这样的更新很麻烦,可使用$set
属性来配置,这样也不用先查询,若是更新的数据比较少,可用性仍是很好的:
PersonModel.update({_id:_id},{$set:{name:'MDragon'}},function(err){});
须要注意,Document
的CRUD
操做都是异步执行,callback
第一个参数必须是err
,而第二个参数各个方法不同,update
的callback
第二个参数是更新的数量,若是要返回更新后的对象,则要使用以下方法
Person.findByIdAndUpdate(_id,{$set:{name:'MDragon'}},function(err,person){ console.log(person.name); //MDragon });
相似的方法还有findByIdAndRemove
,如同名字,只能根据id查询并做update
/remove
操做,操做的数据仅一条
若是是Entity
,使用save
方法,若是是Model
,使用create
方法
//使用Entity来增长一条数据 var krouky = new PersonModel({name:'krouky'}); krouky.save(callback); //使用Model来增长一条数据 var MDragon = {name:'MDragon'}; PersonModel.create(MDragon,callback);
两种新增方法区别在于,若是使用Model
新增时,传入的对象只能是纯净的JSON
对象,不能是由Model
建立的实体,缘由是:由Model
建立的实体krouky
虽然打印是只有{name:'krouky'}
,可是krouky
属于Entity
,包含有Schema
属性和Model
数据库行为模型。若是是使用Model
建立的对象,传入时必定会将隐藏属性也存入数据库,虽然3.x
追加了默认严格属性,但也没必要要增长操做的报错
和新增同样,删除也有2种方式,但Entity
和Model
都使用remove
方法