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

原文地址:https://www.cnblogs.com/Joans/p/9639474.html

时间: 2024-10-10 22:11:06

mongoose中connect()、createConnection()和connection的区别和作用的相关文章

深入解析10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用

SGA_MAX_SIZE是从9i以来就有的作为设置SGA大小的一个参数,而SGA_TARGET则是从10g才有的一个新参数,作为配合10g自动管理SGA而出现的,下面以实验的方式,深入解析这2个参数的区别和作用 [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 13 01:59:11 2014 Copyright (c) 1982, 2005, Oracl

jsp中的contentType与pageEncoding的区别和作用

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码 关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时

VMware中三种网络连接的区别

VMware中三种网络连接的区别 1.概述 2.bridged(桥接模式) 3.NAT(网络地址转换模式) 4.host-only(主机模式) 5.replicate physical network connection state 选项解释 1.概述 大家在安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和VMnet8,如下图.其中VMnet1是host网卡,用于host方式连接网络的.VMnet8是NAT网卡,用于NAT方式连接网络的.它们的IP地址是随机生成的. VMware提供了三

ssh启动报错:org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect

ssh项目启动报错: org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect 一开始以为是数据库连接的事,后来发现是hibernate在实体对象映射数据库表的时候出的错 解决: 查看hibernate.jar包里的hibernate-mapping-3.0.dtd里的 <!DOCTYPE hibernate-mapping PUBLIC &qu

Java中PreparedStatement和Statement的用法区别

Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery

Mongoose中关联查询populate的使用

MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Schema的引用,在查询文档时就可以使用 populate 方法通过引用 Schema 和 id 找到关联的另一个文档或文档的指定字段值.下面是一个简单的栗子: [场景]: 通过学生ID找到学生所在的班级,对应集合: 学生students. 班级clazzs 1 var mongoose = requ

connect() failed (111: Connection refused) while connecting to upstream

配置好lamp后,在浏览器中运行程序后,出现上面的错误. 转自:http://www.xuejiehome.com/blread-1828.html I'm experiencing 502 gateway errors when accessing a PHP file in a directory (http://domain.com/dev/index.php), the logs simply says this: 2011/09/30 23:47:54 [error] 31160#0:

问题:connect() failed (111: Connection refused) while connecting to upstream

问题描述: 服务器重启之后,服务器也正常运行,发现网站访问不了,后来查看nginx 错误日志(/var/log/nginx/error.log ) 2016/05/13 10:47:32 [error] 7688#0: *8 connect() failed (111: Connection refused) while connecting to upstream, client: ****.****.****.33, server: , request: "GET url HTTP/1.1&

使用phpmailer插件发邮件失败提示:SMTP -&gt; ERROR: Failed to connect to server: Connection timed out (110) smtp connect() failed;

一个邮件发送问题,整整弄了我一周时间,起因是这样的,之前弄的一个网站,需要在邮箱里面认证之后才可以注册成功.网站上线了差不多一年之后,客户突然跟我说,网站不能注册了,然后我就查看了一下代码. 发现报这个错误:SMTP -> ERROR: Failed to connect to server: Connection timed out (110)   smtp connect() failed: 这是我的配置. 然后我就想,之前都是可以用的,那会不会可能是客户在邮箱里面更改客户端密码呢?然后我就