继承Mongoose模式

时间:2016-02-12 11:19:57

标签: node.js mongodb mongoose

我想建立一个基础'实体架构',其他模型实体将继承它。 我做到了,有点儿,但后来发生了奇怪的事情。

这些是我的模式:

  • AbstractEntitySchema
  • MessageSchema
  • UserSchema
  • RoomSchema

档案:https://github.com/mihaelamj/nodechat/blob/master/models/db/mongo/schemas.js

但在MongoDB中,它们都保存在同一个文档存储中:'实体模型'不是单独的,如消息,用户.. 我得到了应该发生的事情,但不是我想要的,分开的商店? 如果是这样,我将只生成一个基本的JSON /对象作为实体,并为每个实体附加适当的属性。或者,还有更好的方法? 感谢。

3 个答案:

答案 0 :(得分:7)

Discriminators是架构继承机制。它们使您能够在相同的基础MongoDB集合之上拥有多个具有重叠模式的模型。而不是不同的文件。你似乎误解了猫鼬的discriminators。这篇文章可以帮助您正确捕捉它。

Guide to mongoose discriminators

以下是一些符合您要求的代码示例,将派生架构保存为单独的文档

function AbstractEntitySchema() {   
    //call super        
    Schema.apply(this, arguments);     
    //add                                     
    this.add({                              
        entityName: {type: String, required: false},
        timestamp: {type: Date, default: Date.now},
        index: {type: Number, required: false},
        objectID: {type: String},
        id: {type: String}
    });                                     
};
util.inherits(AbstractEntitySchema, Schema);

//Message Schema
var MessageSchema = new AbstractEntitySchema();
MessageSchema.add({
    text: {type: String, required: true},
    author: {type: String, required: true},
    type: {type: String, required: false}
});

//Room Schema
var RoomSchema = new AbstractEntitySchema();
RoomSchema.add({
    name: {type: String, required: true},
    author: {type: String, required: false},
    messages : [MessageSchema],
});

var Message = mongoose.model('Message', MessageSchema);
var Room = mongoose.model('Room', RoomSchema);

// save data to Message and Room

var aMessage = new Message({
     entityName: 'message',
     text: 'Hello',
     author: 'mmj',
     type: 'article'
    });

 var aRoom = new Room({
     entityName: 'room',
     name: 'Room1',
     author: 'mmj',
     type: 'article'
 });

 aRoom.save(function(err, myRoom) { 
    if (err)
        console.log(err);
    else                                  
        console.log("room is saved"); 
 });

 aMessage.save(function(err) {
    if (err)
        console.log(err);
    else
        console.log('user is saved');
 });

答案 1 :(得分:2)

如果您想要多个重叠模型与不同的MongoDB集合,那么您可以使用这种方法:

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

实施例

const extendSchema = require('mongoose-extend-schema');

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

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

您只需扩展创建架构的原始对象,并在其基础上重新创建新架构。这是您继承的某种抽象模式。

检查此npm模块:https://www.npmjs.com/package/mongoose-extend-schema

答案 2 :(得分:0)

自ES6以来,它同样适用:

var ImageSchema: Schema = new Schema({
    ...CommonMetadataSchema.obj,
    src: String,
    description: String,
});