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對象

相關文章
相關標籤/搜索