Mongoose支持插件功能,我们可以将可重用的功能打包成插件,然后可以在全局级别(mongoose
级别)或模式级别(Schema
级别)加载插件,以实现插件的共享。
1. 插件
模式是可插件化的,也就是说,它允许应用预先打包的一些通用性功能来扩展其功能。这是一个非常强大的功能。
例如,我们的数据库中有多个集合,并希望为每个集合添加最后修改的功能。使用插件,就这很容易实现这一功能。只需创建一个插件并将其应用于每个Schema
即可:
// lastMod.js module.exports = exports = function lastModifiedPlugin (schema, options) { schema.add({ lastMod: Date }); schema.pre('save', function (next) { this.lastMod = new Date(); next(); }); if (options && options.index) { schema.path('lastMod').index(options.index); } } // game-schema.js var lastMod = require('./lastMod'); var Game = new Schema({ ... }); Game.plugin(lastMod, { index: true }); // player-schema.js var lastMod = require('./lastMod'); var Player = new Schema({ ... }); Player.plugin(lastMod);
以上我们将“最后修改”操作添加到了Game
和Player
模式中,并在Game
的lastMod
路径上声明了一个索引。
2. 全局插件
在前面的示例中,我们将插件添加到了所需要的模式中。如果需要在所有Schema中添加/注册一个插件,这时,可以通过mongoose的.plugin()
方法来添加,通过mongoose添加插件即为“全局插件”。如:
var mongoose = require('mongoose'); mongoose.plugin(require('./lastMod')); var gameSchema = new Schema({ ... }); var playerSchema = new Schema({ ... }); // `lastModifiedPlugin` gets attached to both schemas var Game = mongoose.model('Game', gameSchema); var Player = mongoose.model('Player', playerSchema);
3. 官方插件
Mongoose团队维护了几个插件,可以为Mongoose添加了有用的新功能。如:
- mongoose-autopopulate:总是
populate()
Mongoose模式中的某些字段 - mongoose-lean-virtual:使用
.lean()
时,然虚拟属性添加到Mongoose的查询结果中
4. 社区支持
不仅可以在自己的项目中重用模式的功能,还可以从Mongoose社区中获益。任何发布到npm并使用mongoose
标记的插件都会显示在官方的搜索结果页上。
变更记录
- [2018-11-19] 基于Mongoose官方文档
v5.3.12
首次发布