inheritanceMongoose模式

我想创build一个基本的“实体模式”,其他模型实体将inheritance它。 我做了,有点儿,但是后来发生了奇怪的事情。

这些是我的图式:

  • AbstractEntitySchema
  • MessageSchema
  • UserSchema
  • RoomSchema

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

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

Discriminators是一个模式inheritance机制。 它们使您能够在相同的基础MongoDB集合之上拥有多个具有重叠模式的模型。 而不是不同的文件。 你似乎误解了mongoose的discriminators者。 这里有一篇文章可以帮助你正确地理解它。

mongoose鉴别指南


以下是一些代码示例以满足您的要求,将派生模式保存为分隔文档

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

如果你想使用不同的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} }); 

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

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