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等事件触发方法。

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()

使用此方法,在不确定数据库是否需要多连接的情况下,也更为灵活一些

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连接。 它是为不明数量的MongoDB数据库包含相似集合的应用程序设计的。 在这种情况下,应用程序无法预先定义连接; 另一方面,它不需要无限期地保持不活动的连接。 如果已经创建了getConnection(host, db)方法,则该方法将返回到所请求的主机和数据库的连接,否则将创建一个新连接并返回该连接。 实例化ConnectionPool ,可以传递一个options对象,其默认值为: poolSize : 5 , //The size of Mongoose's internal pool expiryPeriod : 300000 , //The number of milliseconds after which a connection expires checkPeriod : 60000 / Mongoose的插件,将findOrCreate方法添加到模型。 该方法将追加一个现有对象或保存一个新对象,具体取决于它是否找到它。 已经有一个,但尚未维护,并且作者未对问题或PR做出回应。 这就是为什么此程序包被称为mongoose-find-or-create 创建架构时,只需添加此插件即可,如下所示: const findOrCreate = require ( 'mongoose-find-or-create' ) const MySchema = new mongoose . Schema ( { name : { type : String } , } from '@lykmapipo/mongoose-connection' ; connect ( error => { ... } ) ; syncIndexes ( error => { ... } ) ; clear ( error => { ... } ) ; drop ( error => { ... } ) ; disconnect ( error => { ... } ) ; 克隆这个仓库 安装所有开发依赖 npm install npm run de mongoose的基础概念 mongoose作为操作mongodb的工具库,可以理解为就是在操作documents。它入门的概念是Schema ,是用来定义collections的documents的形状;通过Schema可以生成一个构造函数Models,它对应的就是collections,而它的实例也称为Documents,对应的就是mongodb的documents。 执行Documents的相关 Api 就能把数据写到mongodb的database。 // 创建Schema,描述文档的形状 本文带你了解如何使用 Mongoose 连接到 MongoDB 服务器。 官方介绍:Mongoose 是一个 MongoDB 对象建模工具,设计用于异步环境。它支持 Promise 和回调。 mongoose.connect() 方法是使用 mongoose 连接 MongoDB 的最简单方法。一旦连接成功,就可以创建 Mongoose 模型并开始与 MongoDB 交互。 // 连接到运行在... 遭遇此坑真是刻骨铭心。。。。。几乎找了半天的错误。。。查了API,看了好多人的代码。。。最后。。。终于发现是哪里有问题。。。 其实不记得这种写法怎么来的了。。。。= = 因为刚开始看代码的时候会点开很多教程看。。可能默默就错了。。。。 var db = mongoose.createConnection(setting.host, setting.db); db.once('open 最近在看mongoose(版本6.13)的源码,作为网络编程入门,以此记录学习笔记,特此分享,有错还望各位指正。 下面是官网上的一个入门例子:一个简单的TCP服务器,它接收客户端的消息并回传给客户端。 其主函数分为以下几步: 1.创建一个连接管理器(mg_mgr) 2.新建一个监听连接(mg_connection),绑定端口和回调函数,加入到事件管理器 3.进入循环,轮询所有连接,如果有事件发... 1. 前言 一直以为连接池是对JDBC的封装,今天再次回顾Java基础的时,才发现并非完全如此。连接池只是包装/操作了JDBC API 接口,然后再实际运行的时候,这些接口的具体实现则 下面是知乎上的一个图:JDBC和连接池的关系 2. JDBC和连接池的关系 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。简单说可以通过JDBC来访问数据库, # 连接(connections)> 原文:[Connections](http://mongoosejs.com/docs/connections.html)## Connections我们可以通过利用`mongoose.connect()`方法连接MongoDB 。```mongoose.connect('mongodb://localhost/myapp');```这是最需要的在连接 ...