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 === || arguments.length === ) &&
typeof arguments[] === 'string' &&
typeof arguments[] === 'object' &&
arguments[].useMongoClient === true) {
return conn.openUri(arguments[], arguments[], arguments[]);
}
if (rgxReplSet.test(arguments[]) || checkReplicaSetInUri(arguments[])) {
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的区别和作用的更多相关文章
- jsp中的contentType与pageEncoding的区别和作用
jsp中的contentType与pageEncoding的区别和作用 <%@ page contentType="text/html; charset=utf-8" p ...
- 深入解析Oracle 10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用
原文链接:http://m.blog.csdn.net/blog/aaron8219/40037005 SGA_MAX_SIZE是从9i以来就有的作为设置SGA大小的一个参数,而SGA_TARGET则 ...
- 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 t ...
- Mongoose中关联查询populate的使用
MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...
- 使用phpmailer插件发邮件失败提示:SMTP -> ERROR: Failed to connect to server: Connection timed out (110) smtp connect() failed;
一个邮件发送问题,整整弄了我一周时间,起因是这样的,之前弄的一个网站,需要在邮箱里面认证之后才可以注册成功.网站上线了差不多一年之后,客户突然跟我说,网站不能注册了,然后我就查看了一下代码. 发现报这 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- nginx访问502 gateway,*1 connect() failed (111: Connection refused) while connecting to upstream
安装好nginx,php环境后,配置虚拟主机,结果访问后就报502 gateway,查看日志文件后,显示错误如下: 2019/04/29 16:24:39 [error] 19433#19433: * ...
- 转:VMware中三种网络连接的区别
转自:http://www.cnblogs.com/rainman/archive/2013/05/06/3063925.html VMware中三种网络连接的区别 1.概述 2.bridged( ...
- Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId
Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...
随机推荐
- 接口测试工具-Jmeter使用笔记(六:从文本读取参数)
使用场景:测试一个接口并发处理数据的能力,并且每次请求传入的参数都要不同. 解决方法--- CSV Data Set Config 列举一个实例,步骤中会侧重读取参数操作的说明,其他有疑问的步骤请查阅 ...
- haier周的计算原则
现使用oracle的sql表示出haier周, 经过对其生成结果的分析,发现海尔周是以周日到周六分别作为一周的始末, 用到的oracle sql中会涉及到calendar week的定义,还涉及到了I ...
- MySQL数据排序asc、desc
数据排序 asc.desc1.单一字段排序order by 字段名称 作用: 通过哪个或哪些字段进行排序 含义: 排序采用 order by 子句,order by 后面跟上排序字段,排序字段可以放多 ...
- Hadoop 集群的三种方式
1,Local(Standalone) Mode 单机模式 $ mkdir input $ cp etc/hadoop/*.xml input $ bin/hadoop jar share/hadoo ...
- DelayQueue源码解析
DelayQueue是一个支持延时获取元素的无界阻塞队列.里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行.也就是 ...
- 约定优于配置---Java的eclipse项目配置
0.测试文件夹test (测试文件的文件夹和源文件夹src是并行的关系,且位于同一目录) 以后源文件.java文件放在src目录下,相应的单元测试文件放在同级别的test目录下,且内部路径要相同 1. ...
- C++ Com控件调用
1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为: HRESULT Add([in] long n1, ...
- Linux:command not found
最近老是遇到command not found 这个问题,然后就上网查到什么文件底下export什么变量啊.后来次数多了,发现不对劲.后来上网查了一下,原来切换到root用户要使用su -,而不是su ...
- Python RabbitMQ消息持久化
RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中. 处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...
- Angular7 表单
Angular 表单 input.checkbox.radio. select. textarea 实现在线预约功能 html 文件 <h2>人员登记系统</h2> <d ...