连接


Connection()

参数
  • base «Mongoose» 一个 Mongoose 实例

继承

Connection 构造函数

出于实际原因,连接等于 Db。


Connection.prototype.asPromise()

返回值
  • «Promise»

返回一个 promise,当此连接成功连接到 MongoDB 时解析,或者如果此连接连接失败则拒绝。

示例

const conn = await mongoose.createConnection('mongodb://127.0.0.1:27017/test').
  asPromise();
conn.readyState; // 1, means Mongoose is connected

Connection.prototype.client

类型
  • «属性»

此连接用于与 MongoDB 交谈的 MongoClient 实例。Mongoose 在连接打开时会自动设置此属性。


Connection.prototype.close()

参数
  • [force] «Boolean» 可选

返回值
  • «Promise»

关闭连接


Connection.prototype.collection()

参数
  • name «String» 集合的名称

  • [options] «Object» 可选的集合选项

返回值
  • «Collection» 集合实例

检索原始集合实例,如果未缓存则创建它。此方法返回 [MongoDB Node.js 驱动程序集合](MongoDB Node.js 驱动程序集合) 的一个薄包装器。使用集合绕过 Mongoose 中间件、验证和转换,允许您直接使用 MongoDB Node.js 驱动程序 功能。


Connection.prototype.collections

类型
  • «属性»

与此连接关联的集合的哈希值


Connection.prototype.config

类型
  • «属性»

与此连接关联的全局选项的哈希值


Connection.prototype.createCollection()

参数
返回值
  • «Promise»

createCollection() 的助手。将使用指定的选项显式创建给定的集合。用于从 mongoose 创建 固定大小集合视图

选项将不经修改传递给 MongoDB 驱动程序的 createCollection() 函数


Connection.prototype.createCollections()

参数
  • continueOnError «Boolean» 为 true 时,将继续创建集合并为出错的集合创建一个新的错误类。

按顺序对模型调用 createCollection()


Connection.prototype.db

类型
  • «属性»

mongodb.Db 实例,在连接打开时设置


Connection.prototype.deleteModel()

参数
  • name «String|RegExp» 如果是字符串,则为要删除的模型的名称。如果正则表达式,则删除所有名称与正则表达式匹配的模型。

返回值
  • «Connection» 本身

从此连接中删除名为 name 的模型(如果存在)。您可以使用此函数清理在测试中创建的任何模型,以防止 OverwriteModelErrors。

示例

conn.model('User', new Schema({ name: String }));
console.log(conn.model('User')); // Model object
conn.deleteModel('User');
console.log(conn.model('User')); // undefined

// Usually useful in a Mocha `afterEach()` hook
afterEach(function() {
  conn.deleteModel(/.+/); // Delete every model
});

Connection.prototype.destroy()

参数
  • [force] «Boolean»

销毁连接。类似于 .close,但还会从 Mongoose 的 connections 列表中删除连接,并阻止连接重新打开。


Connection.prototype.dropCollection()

参数
  • collection «string» 要删除的集合

返回值
  • «Promise»

dropCollection() 的助手。将删除给定的集合,包括所有文档和索引。


Connection.prototype.dropDatabase()

返回值
  • «Promise»

dropDatabase() 的助手。删除给定的数据库,包括所有集合、文档和索引。

示例

const conn = mongoose.createConnection('mongodb://127.0.0.1:27017/mydb');
// Deletes the entire 'mydb' database
await conn.dropDatabase();

Connection.prototype.get()

参数
  • key «String»

获取选项 key 的值。等效于 conn.options[key]

示例

conn.get('test'); // returns the 'test' value

Connection.prototype.getClient()

返回值
  • «MongoClient»

返回此连接用于与 MongoDB 交谈的 MongoDB 驱动程序 MongoClient 实例。

示例

const conn = await mongoose.createConnection('mongodb://127.0.0.1:27017/test').
  asPromise();

conn.getClient(); // MongoClient { ... }

Connection.prototype.host

类型
  • «属性»

URI 的主机名部分。如果有多个主机(例如副本集),这将包含 URI 中的第一个主机名

示例

mongoose.createConnection('mongodb://127.0.0.1:27017/mydb').host; // "127.0.0.1"

Connection.prototype.id

类型
  • «属性»

此连接的数字标识符。用于调试您有多个连接时 多个连接

示例

// The default connection has `id = 0`
mongoose.connection.id; // 0

// If you create a new connection, Mongoose increments id
const conn = mongoose.createConnection();
conn.id; // 1

Connection.prototype.listCollections()

返回值
  • «Promise<Array[Collection]>»

MongoDB Node 驱动程序 listCollections() 的助手。返回一个集合对象的数组。


Connection.prototype.listDatabases()

返回值
  • «Promise<[object Object]>»

MongoDB Node 驱动程序 listDatabases() 的助手。返回一个包含 databases 属性的对象,该属性包含一个数据库对象的数组。

示例

const { databases } = await mongoose.connection.listDatabases();
databases; // [{ name: 'mongoose_test', sizeOnDisk: 0, empty: false }]

Connection.prototype.model()

参数
  • name «String|Function» 模型名称或扩展 Model 的类

  • [schema] «Schema» 模式。定义模型时必须提供。

  • [collection] «String» mongodb 集合的名称(可选)如果未提供,将从模型名称中推断出来

  • [options] «Object»
    • [options.overwriteModels=false] «Boolean» 如果为 true,则用具有相同名称的现有模型覆盖现有模型,以避免 OverwriteModelError

返回值
  • «Model» 已编译的模型
参见

定义或检索模型。

const mongoose = require('mongoose');
const db = mongoose.createConnection(..);
db.model('Venue', new Schema(..));
const Ticket = db.model('Ticket', new Schema(..));
const Venue = db.model('Venue');

当不传递 collection 参数时,Mongoose 通过将模型 name 传递给 utils.toCollectionName 方法来生成集合名称。此方法将名称复数化。如果您不喜欢这种行为,要么传递一个集合名称,要么设置模式的集合名称选项。

示例

const schema = new Schema({ name: String }, { collection: 'actor' });

// or

schema.set('collection', 'actor');

// or

const collectionName = 'actor'
const M = conn.model('Actor', schema, collectionName)

Connection.prototype.modelNames()

返回值
  • «Array[String]»

返回在此连接上创建的模型名称数组。


Connection.prototype.models

类型
  • «属性»

一个 POJO,其中包含一个从模型名称到模型的映射。包含已使用 Connection#model() 添加到此连接的所有模型。

示例

const conn = mongoose.createConnection();
const Test = conn.model('Test', mongoose.Schema({ name: String }));

Object.keys(conn.models).length; // 1
conn.models.Test === Test; // true

Connection.prototype.name

类型
  • «属性»

此连接指向的数据库的名称。

示例

mongoose.createConnection('mongodb://127.0.0.1:27017/mydb').name; // "mydb"

Connection.prototype.openUri()

参数
  • uri «String» 要连接的 URI。

  • [options] «Object» 传递给 MongoClient.connect

    • [options.bufferCommands=true] «Boolean» Mongoose 特定的选项。设置为 false 以 禁用 与此连接关联的所有模型的缓冲。

    • [options.bufferTimeoutMS=10000] «Number» Mongoose 特定的选项。如果 bufferCommands 为 true,Mongoose 将在 bufferTimeoutMS 后抛出一个错误,如果操作仍然被缓冲。

    • [options.dbName] «String» 我们要使用的数据库的名称。如果未提供,则使用连接字符串中的数据库名称。

    • [options.user] «String» 用于身份验证的用户名,等效于 options.auth.user。为了向后兼容而保留。

    • [options.pass] «String» 用于身份验证的密码,等效于 options.auth.password。为了向后兼容而保留。

    • [options.maxPoolSize=100] «Number» MongoDB 驱动程序为此连接保持打开的最大套接字数。请记住,MongoDB 每次只允许每个套接字一个操作,因此如果您发现一些慢速查询阻止了更快的查询继续执行,您可能需要增加此值。参见 MongoDB 和 Node.js 中的慢速列车

    • [options.minPoolSize=0] «Number» MongoDB 驱动程序为此连接保持打开的最小套接字数。请记住,MongoDB 每次只允许每个套接字一个操作,因此如果您发现一些慢速查询阻止了更快的查询继续执行,您可能需要增加此值。参见 MongoDB 和 Node.js 中的慢速列车

    • [options.serverSelectionTimeoutMS] «Number» 如果 useUnifiedTopology = true,MongoDB 驱动程序将尝试找到一个服务器来发送任何给定操作,并在 serverSelectionTimeoutMS 毫秒内不断重试,然后再报错。如果未设置,MongoDB 驱动程序默认使用 30000(30 秒)。

    • [options.heartbeatFrequencyMS] «Number» 如果 useUnifiedTopology = true,MongoDB 驱动程序每 heartbeatFrequencyMS 发送一个心跳来检查连接的状态。心跳会受到 serverSelectionTimeoutMS 的影响,因此 MongoDB 驱动程序默认会将失败的心跳重试最多 30 秒。Mongoose 仅在心跳失败后才发出 'disconnected' 事件,因此您可能希望减小此设置以缩短服务器停止运行到 Mongoose 发出 'disconnected' 事件之间的时间。我们建议您不要将此设置降低到 1000 以下,因为太多心跳会导致性能下降。

    • [options.autoIndex=true] «Boolean» Mongoose 特定的选项。设置为 false 以禁用与此连接关联的所有模型的自动索引创建。

    • [options.socketTimeoutMS=0] «Number» MongoDB 驱动程序在由于 初始连接后 的非活动而终止套接字之前等待多长时间。套接字可能由于没有活动或长时间运行的操作而处于非活动状态。socketTimeoutMS 默认值为 0,这意味着 Node.js 不会由于非活动而超时套接字。此选项在 MongoDB 驱动程序成功完成之后传递给 Node.js socket#setTimeout() 函数

    • [options.family=0] «Number» 透明地传递给 Node.js 的 dns.lookup() 函数。可以是 0, 4, 或 64表示只使用 IPv4,6表示只使用 IPv6,0` 表示尝试两者。

    • [options.autoCreate=false] «Boolean» 设置为 true 以使 Mongoose 自动调用为此连接创建的每个模型上的 createCollection()

使用 MongoClient.connect() 以 URI 打开连接。


Connection.prototype.pass

类型
  • «属性»

URI 中指定的密码

示例

mongoose.createConnection('mongodb://val:[email protected]:27017/mydb').pass; // "psw"

Connection.prototype.plugin()

参数
  • fn «Function» 插件回调

  • [opts] «Object» 可选选项

返回值
  • «Connection» 本身
参见

声明在您传递给 conn.model() 的所有模式上执行的插件

等效于在您创建的每个模式上调用.plugin(fn)

示例

const db = mongoose.createConnection('mongodb://127.0.0.1:27017/mydb');
db.plugin(() => console.log('Applied'));
db.plugins.length; // 1

db.model('Test', new Schema({})); // Prints "Applied"

Connection.prototype.plugins

类型
  • «属性»

将应用于在此连接上创建的所有模型的插件。

示例

const db = mongoose.createConnection('mongodb://127.0.0.1:27017/mydb');
db.plugin(() => console.log('Applied'));
db.plugins.length; // 1

db.model('Test', new Schema({})); // Prints "Applied"

Connection.prototype.port

类型
  • «属性»

URI 的端口部分。如果有多个主机,例如副本集,则将包含 URI 中第一个主机名的端口。

示例

mongoose.createConnection('mongodb://127.0.0.1:27017/mydb').port; // 27017

Connection.prototype.readyState

类型
  • «属性»

连接就绪状态

  • 0 = 已断开连接
  • 1 = 已连接
  • 2 = 正在连接
  • 3 = 正在断开连接

每个状态更改都会发出其关联的事件名称。

示例

conn.on('connected', callback);
conn.on('disconnected', callback);

Connection.prototype.removeDb()

参数
  • name «String» 数据库名称

返回值
  • «Connection» 本身

删除使用 useDb() 创建的给定名称的数据库连接。

如果未找到数据库连接,则抛出错误。

示例

// Connect to `initialdb` first
const conn = await mongoose.createConnection('mongodb://127.0.0.1:27017/initialdb').asPromise();

// Creates an un-cached connection to `mydb`
const db = conn.useDb('mydb');

// Closes `db`, and removes `db` from `conn.relatedDbs` and `conn.otherDbs`
await conn.removeDb('mydb');

Connection.prototype.set()

参数
  • key «String»
  • val «Any»

设置选项 key 的值。等效于 conn.options[key] = val

支持的选项包括

  • maxTimeMS: 为此连接上的所有查询设置maxTimeMS
  • 'debug': 如果为 true,则将 Mongoose 发送到 MongoDB 的操作打印到控制台。如果传递了一个可写流,它将记录到该流,不进行着色。如果传递了回调函数,它将收到集合名称、方法名称,然后是传递给该方法的所有参数。例如,如果您想复制默认日志记录,您可以从回调输出 Mongoose: ${collectionName}.${methodName}(${methodArgs.join(', ')})

示例

conn.set('test', 'foo');
conn.get('test'); // 'foo'
conn.options.test; // 'foo'

Connection.prototype.setClient()

参数
  • client «MongClient» 要设置使用的客户端。

返回值
  • «Connection» 本身

设置MongoDB 驱动程序 MongoClient 实例,此连接使用该实例与 MongoDB 交谈。如果您已经拥有 MongoClient 实例,并且想要重用它,这很有用。

示例

const client = await mongodb.MongoClient.connect('mongodb://127.0.0.1:27017/test');

const conn = mongoose.createConnection().setClient(client);

conn.getClient(); // MongoClient { ... }
conn.readyState; // 1, means 'CONNECTED'

Connection.prototype.startSession()

参数
  • [options] «Object» 查看 mongodb 驱动程序选项

    • [options.causalConsistency=true] «Boolean» 设置为 false 以禁用因果一致性

返回值
  • «Promise<ClientSession>» 解析为 MongoDB 驱动程序 ClientSession 的承诺

需要 MongoDB >= 3.6.0. 启动一个MongoDB 会话,以获得因果一致性、可重试写入事务 等优势。

示例

const session = await conn.startSession();
let doc = await Person.findOne({ name: 'Ned Stark' }, null, { session });
await doc.remove();
// `doc` will always be null, even if reading from a replica set
// secondary. Without causal consistency, it is possible to
// get a doc back from the below query if the query reads from a
// secondary that is experiencing replication lag.
doc = await Person.findOne({ name: 'Ned Stark' }, null, { session, readPreference: 'secondary' });

Connection.prototype.syncIndexes()

参数
  • [options] «Object»
    • [options.continueOnError] «Boolean» 默认情况下为 false。如果设置为 true,Mongoose 不会在某个模型同步失败时抛出错误,并且将返回一个对象,其中键是模型的名称,值是每个模型的结果/错误。

返回值
  • «Promise<Object>» 返回一个承诺,当承诺解析时,值为已删除索引的列表。

同步与此连接注册的所有模型的索引。


Connection.prototype.transaction()

参数
  • fn «Function» 在事务中执行的函数

  • [options] «[object Object]» 事务的可选设置

返回值
  • «Promise<Any>» 如果 Mongoose 成功提交了事务,则承诺将被实现,或者如果事务被中止或 Mongoose 无法提交事务,则承诺将被拒绝。如果已实现,则承诺将解析为 MongoDB 命令结果。

需要 MongoDB >= 3.6.0. 在事务中执行包装的异步函数。如果异步函数成功执行,Mongoose 将提交事务,如果出现可重试错误,则尝试重试。

调用 MongoDB 驱动程序的session.withTransaction(),但还处理如下所示的重置 Mongoose 文档状态。

示例

const doc = new Person({ name: 'Will Riker' });
await db.transaction(async function setRank(session) {
  doc.rank = 'Captain';
  await doc.save({ session });
  doc.isNew; // false

  // Throw an error to abort the transaction
  throw new Error('Oops!');
},{ readPreference: 'primary' }).catch(() => {});

// true, `transaction()` reset the document's state because the
// transaction was aborted.
doc.isNew;

Connection.prototype.useDb()

参数
  • name «String» 数据库名称

  • [options] «Object»
    • [options.useCache=false] «Boolean» 如果为 true,则缓存结果,以便多次使用相同的名称调用 useDb() 仅创建一个连接对象。

    • [options.noListener=false] «Boolean» 如果为 true,则连接对象不会使数据库侦听原始连接上的事件。查看 问题 #9961

返回值
  • «Connection» 新连接对象

使用相同的连接池 切换到不同的数据库。

返回一个新的连接对象,其中包含新的数据库。

示例

// Connect to `initialdb` first
const conn = await mongoose.createConnection('mongodb://127.0.0.1:27017/initialdb').asPromise();

// Creates an un-cached connection to `mydb`
const db = conn.useDb('mydb');
// Creates a cached connection to `mydb2`. All calls to `conn.useDb('mydb2', { useCache: true })` will return the same
// connection instance as opposed to creating a new connection instance
const db2 = conn.useDb('mydb2', { useCache: true });

Connection.prototype.user

类型
  • «属性»

URI 中指定的用户名

示例

mongoose.createConnection('mongodb://val:[email protected]:27017/mydb').user; // "val"

Connection.prototype.watch()

参数
返回值
  • «ChangeStream» 针对 mongoose 的特定更改流包装器,继承自 EventEmitter

监视整个底层数据库以进行更改。类似于Model.watch()

此函数不会触发任何中间件。特别是,它不会触发聚合中间件。

ChangeStream 对象是一个事件发射器,它会发出以下事件

  • 'change': 发生了更改,请参见下面的示例
  • 'error': 发生了不可恢复的错误。特别是,更改流目前会在它们与副本集主服务器失去连接时出错。关注此 GitHub 问题 以获取更新。
  • 'end': 如果底层流关闭,则发出
  • 'close': 如果底层流关闭,则发出

示例

const User = conn.model('User', new Schema({ name: String }));

const changeStream = conn.watch().on('change', data => console.log(data));

// Triggers a 'change' event on the change stream.
await User.create({ name: 'test' });

Connection.prototype.withSession()

参数
  • executor «Function» 使用 1 个参数调用:一个 ClientSession 实例

返回值
  • «Promise» 解析为执行器函数的返回值

connection.client.withSession() 的便捷包装器。

示例

await conn.withSession(async session => {
  const doc = await TestModel.findOne().session(session);
});