2016-02-12 114 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