【问题标题】:How to use mongoose schema when you have dynamic values?当你有动态值时如何使用猫鼬模式?
【发布时间】:2017-12-25 00:19:58
【问题描述】:

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

【问题讨论】:

  • 我真的不清楚你在这里问什么。
  • 无需承诺猫鼬方法。

标签: node.js mongodb mongoose mongoose-schema


【解决方案1】:

架构错误。应该是:

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

【讨论】:

  • ReferenceError: Mixed is not defined at Object. develop/bpm_modeler/server/api/bmpEvents/bmpEvent.model.js:9:12)
  • 然后Schema.Types.Mixed
  • 运气不好body: Schema.Types.Mixed ReferenceError: Schema is not defined
  • 啊,你连Schema都没有导入。添加mongoose 然后:mongoose.Schema.Types.Mixed
  • 这次没有错误但事件对象不存在只是看到_id不确定
【解决方案2】:

我可以建议两种方法:

  • 您只是没有像示例中那样列出您的密钥
  • 您列出所有可能的键,并根据需要标记其中一些键(根据您的逻辑)

例子:

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

【讨论】:

    【解决方案3】:

    这是判别器的一个用例。您可以将 body 设为 Mixed 类型,但这会破坏 mongoose 提供验证的目的。假设您正在为书籍数据库建模。您为一本学术书籍制作了一个名为 Professor 的键。但是你需要为一部小说塑造一个关键的小说家。您需要为小说存储类型,而不是为教育书籍存储类型。 现在,您可以像在用例中一样创建类型键并使用结果。但是,您可能必须为小说中的小说家应用默认值。或者您可能需要设置其中一种类型而不是另一种类型所需的字段。这种方法的另一个问题是对不同类型使用中间件(钩子)。您可能希望在创作小说时执行不同的功能,在创作教育书籍时执行不同的功能。这只是一个场景,您可以拥有 10 或 15 种类型,这将更加难以处理。 现在为了避免这些问题,您可以为每种类型制作不同的模型。但是如果你这样做,当你想查询所有书籍时,你将不得不对每个模型执行一个查询,这将是无效的。您需要 ODM 层上的一些东西。这就是鉴别器发挥作用的地方。 您使用所有类型的书籍中所需的所有键创建一个基本模型,并为其添加一个鉴别键(请参阅文档)。然后,您从该模型的鉴别器功能中创建小说,并添加仅在小说中的附加键。您可以通过这种方式创建任意数量的子模型,然后您可以简单地以多态方式使用它们。在内部,这将创建一个名为 books 的集合,但对于小说,它将仅存储小说的密钥。不同类型模型的验证、中间件等将由 ODM 层处理。 http://mongoosejs.com/docs/discriminators.html

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2015-03-25
      • 2014-06-01
      • 2016-12-26
      • 2021-09-22
      • 2016-01-05
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多