Mongoose是NodeJS中基于MongoDB的驱动,提供一套操作MongoDB数据库的接口。
Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB的Node.js驱动,可以在异步的环境下执行。同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的一些增删改查等常用方法,让Node.js操作MongoDB数据库变得更加容易。
Mongoose 是个 ODM,ODM 的概念对应 SQL中的 ORM。也就是 Ruby on Rails 中的 ActiveRecord 那一层。ORM 全称是 Object-Relational Mapping,对象关系映射;而 ODM 是 Object-Document Mapping,对象文档映射。
Mongoose 的作用是在程序代码中定义数据库中的数据格式,然后取数据时通过它可以把数据库中的 document 映射成程序中的一个对象,这个对象有 .save .update 等一系列方法,和 .title .author 等一系列属性。在调用这些方法时,ODM 会根据你调用时所用的条件,自动转换成相应的 Mongodb Shell 语句帮你发送出去。自然地,在程序中链式调用一个个的方法要比手写数据库操作语句具有更大的灵活性和便利性。
Mongoose构建在MongoDB之上,提供了Schema、Model和Document对象,用起来更为方便。
Schema是一种以文件形式存储的数据库模型骨架,用于定义数据库的结构。类似创建表时的数据定义(不仅仅可以定义文档的结构和属性,还可以定义文档的实例方法、静态模型方法、复合索引等),每个Schema会映射到mongodb中的一个collection,Schema不具备操作数据库的能力。
Model是由Schema编译而成的构造器,具有抽象属性和行为,可以对数据库进行增删查改。Model的每一个实例(instance)就是一个文档document。Model是由Schema发布生成的模型,具有抽象属性和行为的数据库操作对。
Document/Entity 是由Model创建的实体,它的操作也会影响数据库。
Schema生成Model,Model创造Document,Model和Document都可对数据库操作造成影响,但Model比Document更具操作性。
安装
npm install mongoose
# save参数将会把该依赖自动写入到package.json中
npm install mongoose --save
连接
mongoose.connect(uri, [options], [callback])
# uri的格式类似:
mongodb://username:password@host:port/database
mongoose.connect('mongodb://username:password@host:port/database?options...');
connect()方法接受一个选项对象options,该对象将传递给底层驱动程序。这里所包含的所有选项优先于连接字符串中传递的选项。
- db 数据库设置
- server 服务器设置
- replset 副本集设置
- user 用户名
- pass 密码
- auth 鉴权选项
- mongos 连接多个数据库
- promiseLibrary
vim /models/model.js
// 引用mongoose模块
var mogoose = require('mongoose');
// 指定用户连接MongoDB
//Mongoose 做异步操作时,为了向后兼容,Mongoose 4 默认使用mpromise 作为返回值。mpromise已被废弃,推荐使用 ES6风格的 promises库或者ES6原生的Promise库。
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://root:root@127.0.0.1:27017',{useMongoClient:true});
// 监测是否有异常
mongoose.connection.on('error', function(error){
console.log(new Date(), error);
});
mongoose.connection.on('error',console.error.bind(console,'连接错误:'));
// 连接成功会执行connected回调
mongoose.connection.on('connected', function(error){
console.log(new Date(), 'mongodb connected');
});
mongoose.connection.on('disconnected', function(error){
console.log(new Date(), 'mongodb disconnected');
});
module.exports = mongoose;
模式
在Mongoose中,所有的数据都是一种模式,每个模式都映射到MongoDB的集合,并且定义该集合文件结构。
Schema中支持的数据类型,Schema.Type是由Mongoose内定的一些数据类型,基本数据类型都在其中,他也内置了一些Mongoose特有的Schema.Type。当然,你也可以自定义Schema.Type,只有满足Schema.Type的类型才能定义在Schema内。
vim /models/users.js
var mongoose = require('./model.js');
var Schema = mongoose.Schema;
//创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型。
var schema = new Schema({
username:{type:String, required:true, unique:true},
password:{type:String, required:true},
status:{type:Boolean, default:true},
created_at:{type:Date, require:true, default:Date.now},
updated_at:{type:Date},
login_at:{type:Date},
token:{type:String}
});
//创建Model时候定义collection
//默认情况下mongoose会根据我们传入的Model名字来生成collection名字,
//生成名为users(全为小写字母)的collection(集合)
module.exports = mongoose.model('users', schema);
Schema不仅定义了文档结构和使用性能,还可以有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子等。Schema可以定义插件,并且插件具有良好的可拔插性。
模型
新增
如果使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model创建的实体。
如果是Entity,使用save方法,如果是Model,使用create方法。
//使用Model来增加一条数据
PersonModel.create({username:'admin'},callback);
//使用Entity来增加一条数据
var entity= new PersonModel({name:'admin'});
entity.save(callback);
由Model创建的实体krouky虽然打印是只有{name:'krouky'},但是krouky属于Entity,包含有Schema属性和Model数据库行为模型。
如果是使用Model创建的对象,传入时一定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也不必要增加操作的报错。
读取 |