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

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/Joans/p/9639474.html
Copyright © 2011-2022 走看看