2016-02-12 69 views
1

我想创建一个基础'实体模式',其他模型实体将从它继承。 我做到了,挺好,但是后来发生了一件奇怪的事情。继承Mongoose模式

这些都是我的模式:

  • AbstractEntitySchema
  • MessageSchema
  • UserSchema
  • RoomSchema

文件:https://github.com/mihaelamj/nodechat/blob/master/models/db/mongo/schemas.js

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

回答

1

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'); 
}); 
+0

这是否添加对象单独的消息收集我们如何能够利用相同的集合中的所有对象 –

0

如果需要多个重叠的模型与不同的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