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

Posted joans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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等事件触发方法。但是没有Schema哦

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

以上是关于mongoose中connect()createConnection()和connection的区别和作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

如何使用 Jest 在 NestJS 的提供者中模拟和监视“mongoose.connect”

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

mongoose.connect 不是一个函数 - React Native

mongoose.connect() 中的 useNewURLParser 和 useCreateIndex 有啥作用?