我正在尝试创建架构,其中body
可以根据传入的事件在其中包含不同的键。因此,当我尝试呈现数据时,仅将_id
发送到客户端event
不是结果的一部分。我是否为此方法实现了错误的架构?
event.model.js
var mongoose = require('bluebird').promisifyAll(require('mongoose'));
var bmpEventSchema = new mongoose.Schema({
event: {
type: String,
body : {}
}
});
export default mongoose.model('BmpEvent', bmpEventSchema);
JsonDocument
{
"_id" : ObjectId("596f672f4c387baa25db5ec6"),
"event" : {
"type" : "json",
"body" : {
"evntType" : "Smtduki",
"tkt" : "75522655",
"cat" : "RNT",
"esc_lvl" : "4",
"asset" : "DNEC843027 ATI",
"esc_tm" : "2017-05-26 09:18:00",
"tos" : "T3APLS",
"mcn" : "SL6516",
"cusTkt" : "",
"tktSrc" : "BMP",
"tier1" : "STLMOETS"
}
}
}
答案 0 :(得分:0)
架构错了。应该是:
var bmpEventSchema = new mongoose.Schema({
event: {
type: String,
body : Mixed
}
});
答案 1 :(得分:0)
我可以建议两种方法:
示例:
"key": {
type: "string",
required: true
}
答案 2 :(得分:0)
这是判别者的用例。你可以让身体成为混合型,但这样做会破坏猫鼬提供验证的目的。假设你正在为书籍建模'数据库。你为一本学术书制作了一个名为教授的钥匙。但是你需要为小说制作一个关键的小说家。你需要存储小说类型而不是教育书籍。 现在,您可以像在用例中一样创建类型键并使用结果。但是,你可能不得不在小说中为小说家应用默认值。或者您可能需要设置其中一种类型而不是另一种类型所需的字段。该方法的另一个问题是对不同类型使用中间件(挂钩)。您可能希望在创建教育书籍时创建新颖和不同功能的不同功能。这只是一个场景,你可以拥有10或15种类型,这将更加繁琐。 现在,为了避免这些问题,您可以为每种类型制作不同的模型。但是如果你这样做,当你想要查询所有书籍时,你将不得不对每个模型执行查询,这将是无效的。您需要在ODM层上使用某些东西。这是歧视者发挥作用的地方。 您可以在所有类型的书籍中创建包含所需键的基本模型,并为其添加一个判别键(请参阅文档)。然后你从这个模型的鉴别器功能创建小说,并添加只有新颖的附加键。你可以用这种方式创建任意数量的子模型,然后你可以简单地以多态方式使用它们。在内部,这将创建一个名为书籍的单一集合,但对于小说,它将只存储小说和#39;键。不同类型模型的验证,中间件等将由ODM层处理。 http://mongoosejs.com/docs/discriminators.html