我想建立一个基础'实体架构',其他模型实体将继承它。 我做到了,有点儿,但后来发生了奇怪的事情。
这些是我的模式:
档案:https://github.com/mihaelamj/nodechat/blob/master/models/db/mongo/schemas.js
但在MongoDB中,它们都保存在同一个文档存储中:'实体模型'不是单独的,如消息,用户.. 我得到了应该发生的事情,但不是我想要的,分开的商店? 如果是这样,我将只生成一个基本的JSON /对象作为实体,并为每个实体附加适当的属性。或者,还有更好的方法? 感谢。
答案 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,
});