插件 - 图1mongoose

插件 - 图2mongoose

插件

Schema 是可拓展的,你可以用打包好的功能拓展你的 Schema。这是一个很实用的特性。

试想下数据库里有很多个 collection,我们需要对它们都添加 记录“最后修改”的功能。使用插件,我们很容易做到。 创建一次插件,然后应用到每个 Schema 就好了。

  1. // lastMod.js
  2. module.exports = exports = function lastModifiedPlugin (schema, options) {
  3. schema.add({ lastMod: Date });
  4. schema.pre('save', function (next) {
  5. this.lastMod = new Date();
  6. next();
  7. });
  8. if (options && options.index) {
  9. schema.path('lastMod').index(options.index);
  10. }
  11. }
  12. // game-schema.js
  13. var lastMod = require('./lastMod');
  14. var Game = new Schema({ ... });
  15. Game.plugin(lastMod, { index: true });
  16. // player-schema.js
  17. var lastMod = require('./lastMod');
  18. var Player = new Schema({ ... });
  19. Player.plugin(lastMod);

这样就已经在 GamePlayer 添加了记录最后修改功能, 同时对 game 的 lastMod 添加索引。这寥寥几行代码,看起来不错。

全局插件

想对所有 schema 注册插件?可以使用 mongoose 单例提供的 .plugin() 函数,请看例子:

  1. var mongoose = require('mongoose');
  2. mongoose.plugin(require('./lastMod'));
  3. var gameSchema = new Schema({ ... });
  4. var playerSchema = new Schema({ ... });
  5. // `lastModifiedPlugin` gets attached to both schemas
  6. var Game = mongoose.model('Game', gameSchema);
  7. var Player = mongoose.model('Player', playerSchema);

社区!

你还可以逛逛 Mongoose 社区!看看有什么好用的插件,当然你也可以把自己的插件分享到社区。 你只要把插件发布到 npm 并打上 mongoose 的 tag, 就能在我们的插件专页搜索到啦。