1. 程式人生 > >mongoose中connect()、createConnection()和connection的區別和作用

mongoose中connect()、createConnection()和connection的區別和作用

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,操作資料

//建立一個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欄位,資料型別等

在這個使用方法中,值得注意的是,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物件,能夠操作資料庫,但是不能操作具體的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()方法搭配使用:

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()
});

使用此方法,在不確定資料庫是否需要多連線的情況下,也更為靈活一些

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物件