【问题标题】:subdocument with different schemas具有不同模式的子文档
【发布时间】:2017-01-17 20:20:42
【问题描述】:

我是 Mongoose 的新手,我正在尝试了解如何正确声明结构。

比如说,我有一个集合todos,其中应该包含描述应该做什么的文档。所有 TODO 项都有一些共同的属性,但大多数细节取决于具体的任务。

// Tasks:

var hairCutSchema = new Schema({
  style: {type: String, required:true},
  length: Number
});

var paintWallSchema = new Schema({
  color: {type: String, required:true},
  surface: Number, required:true},
  layers: Number
});

let napSchema = new Schema({
  duration: {type: Number, required:true},
  dream: String,
  pillows: Number,
  // ....
});


// TODOs (parent document):

var todoSchema = new Schema({
  due: Date,
  created: Date,
  task: <either hairCutSchema, paintWallSchema OR napSchema>
});

当然,这不是真正有效的代码,但我希望它能说明我的问题:

每个待办事项都应该包含一个任务。有一个有限的、众所周知的可能任务列表,每个任务都有非常具体的属性/schema(在我的应用程序中,这些子文档会更加复杂)。

AFAIK 这无法使用 [子文档] 解决,因为我只能为每个字段分配 一个 子文档类型。无论如何,我只需要一个子文档,而不是列表。

另一种可能是这样的:

var todoSchema = new Schema({
  due: Date,
  created: Date,

  hairCutTask: haitCutSchema,
  paintWallTask: paintWallSchema,
  napTask: napSchema
});

但是,这样架构不会阻止我同时声明 hairCutTasknapTask - 并且可能所需的子文档字段会使 每个 成为必需的三种类型.


什么是构建此类数据的好方法以及架构应该是什么样的?

【问题讨论】:

  • "AFAIK 这无法使用 [子文档] 解决,因为我只能为每个字段分配一个子文档类型。" -- 您可以为此查看 Schema.Types.Mixed(不如创建对集合项的实际引用有用)
  • 这种“混合”模式类型不会阻止我存储一些毫无意义的东西,不匹配任何任务模式,对吧?

标签: mongoose mongoose-schema


【解决方案1】:

“鉴别器”可能是我正在寻找的:http://mongoosejs.com/docs/discriminators.html

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多