mogoose
schema---模式定义,堆数据库字段的类型进行定义【string,int,float】
var mongoose = require('mongoose'); // 顶会议用户组件 // 创建模型 var Schema = mongoose.Schema; var userScheMa = new Schema({ userid: String, password: String });
Model---编译模型
通过模式构造而来
Document---文档实例化
Mongoose中的操作流程
1. 连接数据库
var mongoose = require("mongoose"); // 连接字符串格式为mongodb://主机/数据库名 mongoose.connect('mongodb://localhost/test');
2. 存储数据
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'); });
以上是最简单的数据操作了
流程就是:通过Schema创建一个模式movieSchema ,通过模式movieSchema创建一个模型Movie,通过模型Movie写入数据,通过save方法保存
定义schema->创建model->实例化方法
表 –》 合集 –》 文档
这里涉及几个名词概念Schema与Model
3.Schema与
Model
- Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
- Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
虽然模式(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('删除成功') });
3. Documents
Document
是与MongoDB
文档一一对应的模型,Document
可等同于Entity
,具有属性和操作性
注意:
Document
的`CRUD都必须经过严格验证的,参看2.5.2 Schema的strict严格配置
3.1 查询
查询内容过多,专题讲解
3.2 更新
有许多方式来更新文件,以下是常用的传统方式:
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
操作,操作的数据仅一条
3.3 新增
如果是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
追加了默认严格属性,但也不必要增加操作的报错
3.4 删除
和新增一样,删除也有2种方式,但Entity
和Model
都使用remove
方法