向猫鼬模式中的对象对象添加鉴别器(动态类型)

时间:2021-02-01 10:01:54

标签: mongodb mongoose discriminator

我正在为猫鼬中的鉴别器的概念而苦苦挣扎。我基于 https://stackoverflow.com/a/36464686/4549743 构建了我当前的解决方案。但是我的结构略有不同。

我有一个帖子模型,允许用户添加自定义字段。用户基本上可以在values的values对象中添加任意类型(Date、String、Number)作为键值对。每个新条目都以 title: {value: 'lorem', format: 'eg.文本,日期'}。请注意,格式键仅用于前端,并且始终可以是字符串。 'title' 可以是用户选择的任意值。我现在意识到我需要添加一个鉴别器来将日期和数字保存为自己的类型,以便根据日期等检索数据。

当前保存的帖子如下所示:

 {
    _id: ObjectId('6017b4f3ed8b0517220a04a1'),
    expiresAt: '2022-02-01T07:59:47.850+00:00'
    createdAt: '2021-02-01T07:59:47.850+00:00',
    values: {
       title: {
         value: 'Headline of post',
         format: 'text'
       },
       deadline: {
         value: '12-12-2021',
         format: 'date'
       },
       description: {
          value: 'Lore ipsum ...',
          format: 'string'
       }         
    }
 }

正如stackoverflow 中提到的,我需要添加一个鉴别器。然而,给出的答案仅适用于添加单个键值对的情况,而不是由许多不同类型的不同对象组成的对象。

我目前的解决方案是这样的。但是,当保存它时,值不会被保存。因此,我认为它一定是错误的,不能这样解释。 无功 猫鼬 = 要求('猫鼬'), 架构 = 猫鼬。架构, util = require('util')

function BaseSchema() {

  Schema.apply(this,arguments);

  this.add({
    createdAt: { type: Date, required: 'date required' },
    expiresAt: { type: Date, required: 'expire date required'}
  });

}

util.inherits(BaseSchema,Schema);

var post = new BaseSchema();

//Create Schemas for each possible type a user can add to the values property in POST.

var stringSchema = new BaseSchema({
  values: {
    value: String,
    format: String
  }
});

var numberSchema = new BaseSchema({
  values: {
    value: Number,
    format: String
  }
});

var dateSchema = new BaseSchema({
  values: {
    value: Date,
    format: String
  }
});


var Post = mongoose.model('Post', post),
  StringModel = Post.discriminator('StringModel', stringSchema),
  NumberModel = Post.discriminator('NumberModel', numberSchema),
  DateModel = Post.discriminator('DateModel', dateSchema)


// Compile model from schema

module.exports.Post = Post;

我认为问题出在某个地方,实际上是一个可以接受任何 [key] 的对象的对象。这似乎不能通过简单地执行:

var dateSchema = new BaseSchema({
      values: {
        value: Date,
        format: String
      }
    });

感谢您的帮助。

0 个答案:

没有答案
相关问题