有动态值时如何使用mongoose模式?

时间:2017-07-19 15:50:49

标签: node.js mongodb mongoose mongoose-schema

我正在尝试创建架构,其中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"
        }
    }
}

3 个答案:

答案 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