2017-07-19 55 views
0

我想创建模式,其中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

不需要提供猫鼬方法。 – Lazyexpert

回答

0

模式是错误的。应该是:

var bmpEventSchema = new mongoose.Schema({ 
    event: { 
    type: String, 
    body : Mixed 
    } 
}); 
+0

参考错误:未在对象处定义混合 。 开发/ bpm_modeler /服务器/ API/bmpEvents/bmpEvent.model.js:9:12) – hussain

+0

然后'Schema.Types.Mixed' –

+0

没有运气'体:Schema.Types.Mixed 的ReferenceError:架构不defined' – hussain

0

有两种方法我可以建议:

  • 你根本就没有列出你的钥匙在你的榜样
  • 你列出所有可能的密钥,并标记它们中的一些作为(根据你的逻辑)所需

实施例:

"key": { 
    type: "string", 
    required: true 
} 
0

这是一个用例discrimnators。你可以使身体成为混合类型,但是这会破坏猫鼬的目的以提供验证。假设你正在模拟书籍的数据库。你为一本教科书制作了一个名为教授的钥匙。但是,那么你需要为小说做一个关键的小说家。你需要存储流派的小说而不是教育书籍。 现在你可以像你在用例中那样制作一个类型键,并与结果一起玩。但是,你可能不得不在小说中为小说家应用默认值。或者您可能需要设置其中一种类型而不是另一种类型所需的字段。这种方法的另一个问题是使用中间件(挂钩)到不同的类型。你可能想要创建一个不同的功能来创建教科书的新颖和不同的功能。这只是一个场景,你可以有10或15种类型,这将更加麻烦。 现在为了避免这些问题,您可以为每种类型制作不同的模型。但是如果你这样做,当你想查询所有书籍时,你将不得不对每个模型进行查询,这将是无效的。你需要ODM层上的东西。这是歧视者进场的地方。 你让所有你在所有类型的书要密钥的基础模型,并添加discrimnator键(请参考文档)。然后你从这个模型的鉴别器函数创建一个小说,并添加只有新颖的附加键。您可以按照这种方式创建尽可能多的子模型,然后以简单的多态方式使用它们。在内部,这将创建一个名为书籍的单一集合,但对于小说,它将只存储小说的关键。 ODM层将处理不同类型模型的验证,中间件等。 http://mongoosejs.com/docs/discriminators.html