转文:原文

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的区别和作用的更多相关文章

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

    jsp中的contentType与pageEncoding的区别和作用   <%@ page contentType="text/html; charset=utf-8" p ...

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

    原文链接:http://m.blog.csdn.net/blog/aaron8219/40037005 SGA_MAX_SIZE是从9i以来就有的作为设置SGA大小的一个参数,而SGA_TARGET则 ...

  3. 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 ...

  4. Mongoose中关联查询populate的使用

    MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...

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

    一个邮件发送问题,整整弄了我一周时间,起因是这样的,之前弄的一个网站,需要在邮箱里面认证之后才可以注册成功.网站上线了差不多一年之后,客户突然跟我说,网站不能注册了,然后我就查看了一下代码. 发现报这 ...

  6. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  7. 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: * ...

  8. 转:VMware中三种网络连接的区别

    转自:http://www.cnblogs.com/rainman/archive/2013/05/06/3063925.html VMware中三种网络连接的区别   1.概述 2.bridged( ...

  9. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

随机推荐

  1. SparkML之推荐引擎(一)---电影推荐

    本文将使用 SparkML 来构建推荐引擎. 推荐引擎算法大致分为 基于内容的过滤.协同过滤.矩阵分解,本文将使用基于属于矩阵分解的 最小二乘法 算法来构建推荐引擎. 对于推荐引擎模块这里将分为两篇文 ...

  2. MTSC2019第五届中国移动互联网测试开发大会北京站震撼来袭!

    MTSC2019 暨第五届中国移动互联网测试开发大会(Mobile Testing Summit China)是由国内最大的测试开发技术社区之一 TesterHome 发起的行业会议,聚焦于软件测试及 ...

  3. phpstudy----------如何将phpstudy里面的mysql升级到指定版本,如何升级指定PHP版本

    1.下载指定版本:从官网上下载高版本的 MySQL :https://dev.mysql.com/downloads/file/?id=467269,选的版本是 5.7.17 2.请注意第四部以前是可 ...

  4. 转载一篇较为详细的caffe-ssd编译环境的搭建

    这篇搭建的文章写得还是比较全面的,亲测有效:https://blog.csdn.net/lukaslong/article/details/81390276

  5. tensorboard窥视

    运行神经网络时,跟踪网络参数,以及输入输出是很重要的,可据此判断模型是否在学习,损失函数的值是否在不断减小.Tensorboard通过可视化方法,用于分析和调试网络模型. 使用tensorboard的 ...

  6. 【软件工程1916|W(福州大学)_助教博客】团队第一次作业成绩公示

    题目 第一次作业 评分准则: 队名(最好能够体现项目内容,要求有亮点与个性):(1分) 拟作的团队项目描述:一句话(中英文不限):(1分) 队员风采:介绍每一名队员,包括成员性格.擅长的技术.编程的兴 ...

  7. Java代码走查具体考察点

    代码走查具体考察点 一.参数检验 公共方法都要做参数的校验,参数校验不通过,需要明确抛出异常或对应响应码. 在接口中也明确使用验证注解修饰参数和返回值,作为一种协议要求调用方按注解约束传参,返回值验证 ...

  8. python核心技术

    基本语法 Python的设计目标之一是让代码具备高度的可阅读性.它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观.它不像其他的静态语言如C.Pascal那样需要重复书写声明语 ...

  9. GO数组

    Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 数组定义: var 数组变量名 [元素数量]T ]int //定 ...

  10. mybatis的sql映射文件不能打包进目录解决办法

    方法二: <build> <finalName>qwe</finalName> <plugins> <plugin> <groupId ...