zoukankan      html  css  js  c++  java
  • 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对象

  • 相关阅读:
    CentOS7 yum方式安装MariaDB 10.2.13-1
    追踪go语言(golang)的新版本新特性【摘抄】
    基于Jersey使用Session
    Netbeans 8.1 检测不到Tomcat8.5.3以上版本已经启动的Bug
    CentOS6上实现Tomcat8 service启动,并查看status
    【转帖】oracle数据类型和对应的java类型
    css文件的MIME错误引发的Jquery Mobile绘制错误
    Elasticsearch index fields 重命名
    oozie调度sqoop Job 数据库密码无法保存
    Java——安全地停止线程
  • 原文地址:https://www.cnblogs.com/Joans/p/9639474.html
Copyright © 2011-2022 走看看