mongoose中connect()、createConnection()和connection的区别和作用
来源:互联网 发布:linux中连接本地 编辑:程序博客网 时间:2024/05/20 01:38
1 mongoose简介
在使用mongodb数据库开发项目中,nodejs环境下可能会使用到mongoose模块连接并操作mongodb数据库。mongoose模块相当于Java中的数据库驱动,例如mysql-connector-driver-xxx.jar等,大体作用都是连接数据库,对数据库中的表增删改查等。
使用方法很简单:
npm install mongoose //在项目中安装模块
var mongoose = require('mongoose');//获取模块的引用
在mongoose中连接数据有几种方法,有区别又有一定的联系,下面一一记录个人的理解:
2 connect()
- mongoose.connect(uri(s), [options], [options.useMongoClient], [callback])
此方法打开一个默认的mongoose连接(Opens the default mongoose connection.
),返回一个MongooseThenable
对象,值得一提的是,mongoose new了一个实例作为MongooseThenable
中的属性,一起返回,它在源码中是这样的:
Mongoose.prototype.connect = function() { var conn = this.connection; if ((arguments.length === 2 || arguments.length === 3) && typeof arguments[0] === 'string' && typeof arguments[1] === 'object' && arguments[1].useMongoClient === true) { return conn.openUri(arguments[0], arguments[1], arguments[2]); } if (rgxReplSet.test(arguments[0]) || checkReplicaSetInUri(arguments[0])) { return new MongooseThenable(this, conn.openSet.apply(conn, arguments)); } return new MongooseThenable(this, conn.open.apply(conn, arguments));};
......MongooseThenable.prototype = new Mongoose;......
1 使用方法,获取连接
var mongoose = require('mongoose');var URL = 'mongodb://localhost:27017/test3';mongoose.connect(URL,function(err){ if(err){ console.warn('数据库连接失败:'+err); }else { console.log('数据库成功连接到:'+URL); }});
2 生成model,操作数据
//创建一个Schemavar kittenSchema = mongoose.Schema({ name:String, createDate:Date});var Kitten = mongoose.model('kitten',kittenSchema);//生成一个modelvar silence = new Kitten({name:'silence',createDate:new Date()});//创建一个实例//保存方法,保存实例进入到数据库中silence.save(function(err){ if (err){ console.log(err); }else{ console.log('保存成功'); }});
注意: mongoose中能够操作数据的是model,model需要使用Schema生成,Schema定义collection字段,数据类型等
在这个使用方法中,值得注意的是,connect()方法生成model的方式和返回值类型,这将是跟createConnection()最大的不同之处
3 createConnection()
- mongoose.createConnection([uri], [options], [options.config], [options.config.autoIndex], [options.useMongoClient])
此方法获取数据库连接,操作database层面,返回一个Connection对象。Connection对象中包含model,collection,dropDatabase等操作数据库的方法,也包含connected,disconnected,error等事件触发方法。
1 使用方法,获取连接
var mongoose = require('mongoose');var URL = 'mongodb://localhost:27017/test2';//实际上只是创建了一个Connection对象,能够操作数据库,但是不能操作具体的documentvar db = mongoose.createConnection(URL);db.on('connected',function(err){ if(err){ console.log('连接数据库失败:'+err); }else{ console.log('连接数据库成功!'); }});
2 生成model,操作数据库
var Schema = mongoose.Schema;var userSchema = new Schema({ name:String},{ collection:'tb_user'})var User = db.model('user',userSchema);var userModel = new User({ name:'luoxia'});userModel.save(function(err,result){ if(err){ console.log(err); }else{ console.log('保存成功!'); }});
在这个方法中,连接数据之后并不能直接操作Schema生成model,然后操作实例保存数据,而是还需要引用mongoose中的Schema来生成model。
4 connection
connection是mongoose模块的默认引用,返回一个Connetion对象。因为connect()方法并不能监听数据库连接情况,所以,一般情况下此方法跟connet()方法搭配使用:
var mongoose = require('mongoose');//var Schema = mongoose.Schema;var URL = 'mongodb://localhost:27017/test3';mongoose.connect(URL);var db = mongoose.connection;//获取connection实例//使用Connetion监听连接状态db.on('connected',function(err){ if(err){ console.log('连接数据库失败:'+err); }else{ console.log('连接数据库成功!'); }});var userSchema = new Schema({ name:String, date:Date});var User = mongoose.model('usert',userSchema);//默认表名:userttsvar userm = new User({ name:'yanghao', date:new Date()});
使用此方法,在不确定数据库是否需要多连接的情况下,也更为灵活一些
5 总结
1、createConnetion()方法的返回值是一个Connetion,虽然提供了操作collection、model等的方法,但是需要引用Schema来单独操作,也就是说在操作model之前,都需要
var mongoose = require('monggose');var Schema = mongoose.Schema;
这两句代码来获取Schema,这应该就是使用createConnetion可以操作多个数据库的原因。
2、connet()方法的返回值中包含了一个mongoose的引用,所以在项目中只能对一个数据库操作,不需要重新引用Schema,所以只能在操作单数据库的情况下使用;而在操作多个数据库的情况下,可以使用createConnetion()方法。
3、connection是mongoose模块的默认连接。返回一个Connetion对象
- mongoose中connect()、createConnection()和connection的区别和作用
- 【大雾】mongoose中createConnection和connect的大坑!
- 小记: JDBC中connection.isClosed 和 connection.isValid的区别
- Connection和Session的区别
- connection和session的区别
- Connection接口中isClosed() 和 isValid() 的区别
- CreateInstance(_T("ADODB.Connection"))和CreateInstance(__uuidof(Connection))的区别
- com.mysql.jdbc.connection和java.sql.connection的区别。
- C++中string和string.h的作用和区别
- C++中string和string.h的作用和区别
- C#中ref和out的作用和区别
- PHP 中 magic_quotes_gpc 和 magic_quotes_runtime 的区别,作用和用法
- PHP中magic_quotes_gpc和magic_quotes_runtime的区别、作用和用法
- C++中string和string.h的作用和区别
- C++中string和string.h的作用和区别
- linux中export和source的作用和区别
- PHP中magic_quotes_gpc和magic_quotes_runtime的区别、作用和用法
- PHP中magic_quotes_gpc和magic_quotes_runtime的区别、作用和用法
- 换钱的方法数
- 如何找出数列中符合条件的数对的个数
- 268. Missing Number
- 简单 Shell 脚本随手录
- easyui设置datebox默认当前日期,且只能选择当前日期之前的日期
- mongoose中connect()、createConnection()和connection的区别和作用
- javascript学习笔记:BOM对象(存疑)
- ARM-Linux移植之(一)——内核启动流程分析
- 一些精致的web UI框架及常用前端UI框架
- 数字变成大写金额
- The Festive Evening(思维题)
- C++ auto
- 通过KBUILD_MODNAME让dev_err等函数打印模块的name
- 万里长征第一步----学会做科研