mongoose中connect()、createConnection()和connection的区别和做用

转文:原文node

1 mongoose简介

在使用mongodb数据库开发项目中,nodejs环境下可能会使用到mongoose模块链接并操做mongodb数据库。mongoose模块至关于Java中的数据库驱动,例如mysql-connector-driver-xxx.jar等,大致做用都是链接数据库,对数据库中的表增删改查等。mysql

使用方法很简单:sql

npm install mongoose //在项目中安装模块mongodb

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中的属性,一块儿返回,它在源码中是这样的:npm

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,操做数据

//建立一个Schema
var kittenSchema = mongoose.Schema({ name:String, createDate:Date }); var Kitten = mongoose.model('kitten',kittenSchema);//生成一个model

var 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字段,数据类型等app

在这个使用方法中,值得注意的是,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等事件触发方法。可是没有Schema哦mongoose

1 使用方法,获取链接

var mongoose = require('mongoose'); var URL = 'mongodb://localhost:27017/test2'; //实际上只是建立了一个Connection对象,可以操做数据库,可是不能操做具体的document
var 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()方法搭配使用:ui

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);//默认表名:usertts

var userm = new User({ name:'yanghao', date:new Date() });

 

使用此方法,在不肯定数据库是否须要多链接的状况下,也更为灵活一些this

5 总结

一、createConnetion()方法的返回值是一个Connetion,虽然提供了操做collection、model等的方法,可是须要引用Schema来单独操做,也就是说在操做model以前,都须要

var mongoose = require('monggose'); var Schema = mongoose.Schema;

这两句代码来获取Schema,这应该就是使用createConnetion能够操做多个数据库的缘由。 
二、connet()方法的返回值中包含了一个mongoose的引用,因此在项目中只能对一个数据库操做,不须要从新引用Schema,因此只能在操做单数据库的状况下使用;而在操做多个数据库的状况下,可使用createConnetion()方法。 三、connection是mongoose模块的默认链接。返回一个Connetion对象

相关文章
相关标签/搜索