16

您好,我需要在 mongoose 库中继承我的模式。有完整的插件吗?或者我自己应该怎么做?

我还需要从 Base 模式继承所有 pre、post、init 中间件。

4

5 回答 5

18

对于其他寻求此功能的人,Mongoose 3.8 现在具有通过鉴别器功能的模式继承:

https://github.com/LearnBoost/mongoose/pull/1647

于 2013-11-17T21:53:11.210 回答
17

您可能想看看使用 Mongoose 插件:

一个可以“开箱即用”的插件在这里:

于 2013-01-09T05:41:26.320 回答
3

我知道这是一个老歌,但我来到这里寻找同一个问题的答案,最终做了一些不同的事情。我不想使用鉴别器,因为所有文档都存储在同一个集合中。

模型库.js

var db = require('mongoose');

module.exports = function(paths) {
    var schema = new db.Schema({ 
        field1: { type: String, required: false, index: false },
        field2: { type: String, required: false, index: false } 
    }, { 
        timestamps: { 
            createdAt: 'CreatedOn', 
            updatedAt: 'ModifiedOn' 
        } 
    });

    schema.add(paths);

    return schema;
};

新模型.js

var db = require('mongoose');
var base = require('./ModelBase');
var schema = new base({
    field3: { type: String, required: false, index: false },
    field4: { type: String, required: false, index: false }
});

db.model('NewModelItem', schema, 'NewModelItems');

所有 4 个字段都将在 NewModelItem 中。将 ModelBase 用于要使用相同字段/选项/等的其他模型。在我的项目中,我把时间戳放在那里。

Schema.add 在 Schema 构造函数中被调用,因此模型应该像在原始构造函数调用中发送所有字段一样进行组装。

于 2016-09-17T03:35:16.350 回答
3

如果你想使用不同的集合

function extendSchema (Schema, definition, options) {
  return new mongoose.Schema(
    Object.assign({}, Schema.obj, definition),
    options
  );
}

用法:

const UserSchema = new mongoose.Schema({
  firstname: {type: String},
  lastname: {type: String}
});

const ClientSchema = extendSchema(UserSchema, {
  phone: {type: String, required: true}
});

https://www.npmjs.com/package/mongoose-extend-schema

于 2017-07-28T18:47:52.723 回答
0

检查此框架的模型是否适用于 Mongoose:

https://github.com/marian2js/rode#models-with-mongoose

这是使用此框架扩展 shemas 的示例:

首先在一个新的“rode model”中定义你的模式:

var rode = require('rode');

var User = rode.Model.extend({
  name: 'User',
  schema: {
    name: {
      type: 'String',
      unique: true
    },
    email: String,
    password: String
  }
});

现在你应该调用extend方法:

var Admin = User.extend({
  name: 'Admin',
  // The schema for admins is the schema for users + their own schema
  schema: {
    lastAccess: Date
  }
});

但是请记住从框架 github 中提取的此注释:“两个模型将在 MongoDB 上共享相同的集合。扩展模型的文档将具有一个属性 _type 来区分。”

于 2014-02-11T17:37:10.917 回答