具有 2 个(或更多)模式类型的 mongoose 数组

Posted

技术标签:

【中文标题】具有 2 个(或更多)模式类型的 mongoose 数组【英文标题】:mongoose array with 2 (or more) schema types 【发布时间】:2014-05-13 03:53:25 【问题描述】:

根据这个问题的答案, Nested arrays in Mongoose

我想知道是否有一种方法可以在 mongoose 模式中创建一个数组,该数组只接受两种类型的 Schema 定义文档中的一种作为数组中的元素。我这是什么意思?考虑一个定义为...

var MyDocSchema = new Schema(
  name: String,
  stuff: [Stuff],
);

其中的东西被定义为

var Stuff = new Schema(
  name: String,
  value: Number,
);

这行得通,但是如果我想要我的东西怎么办:数组能够包含 Stuff 或 OtherStuff....

var MyDocSchema = new Schema(
  name: String,
  stuff: [Stuff *or* OtherStuff ],
);

其中 Stuff 与之前相同,OtherStuff 定义为

var OtherStuff = new Schema(
  count: Number,
  when: Date,
);

【问题讨论】:

【参考方案1】:

基本上有两种方法可以做到这一点:

    将 Stuff 和 OtherStuff 存储在另一个自己的集合(同一个集合)中,并且只存储字段中对象的 id,然后您可以填充结果。此解决方案的诀窍是您要创建两个指向同一个集合的 mongoose 模型。

    注意:此解决方案适用于大且差异很大的 Stuff 和 OtherStuff 对象(因为 mongoDb 存储启发式),文档计数低(因为填充是一个缓慢的过程)。最终,如果对象非常不同,它们应该有自己的字段。

    使用鉴别器。基本上,您的示例需要三个 document 架构(其他架构保持不变):

    // -- Stuff --
    // Please copy from above
    
    // -- OtherStuff --
    // Please copy from above
    
    // MyDocument -
    var MyDocSchema = new Schema( name: String );
    
    // MyDocStuff - 
    var MyDocStuffSchema = new Schema( stuff: [Stuff] );
    
    // MyDocOtherStuff - 
    var MyDocOtherStuffSchema = new Schema( stuff: [OtherStuff] );
    
    var myDoc = new mongoose.Model( 'myDoc', myDocSchema );
    var myDocStuff = myDoc.discriminator( 'myDocStuff', myDocStuffSchema );
    var myDocOtherStuff = myDoc.discriminator( 'myDocOtherStuff', myDocOtherStuffSchema );
    
    // when writing with this method, you need to know which model is relevant
    // isOtherStuff() just checks for _when_ or _count_ fields
    if( isOtherStuff(doc) ) 
        myDocOtherStuff.create(doc);
     else 
        myDocStuff.create(doc);
     
    

注意:这是与看起来相似的多态对象一起使用的解决方案,对于文档中的大 N 来说速度很快。

【讨论】:

有趣。我不知道猫鼬中的鉴别器。 尽管这很有趣,但我发现这个例子很难理解。那是伪代码与真实代码的混合吗? 谢谢。这是代码,但需要问题中的一些 sn-ps 才能 lint。 我们能不能只做这些事情:[Stuff || OtherStuff ],最简单的..在最新的 mongoose 版本 > 5.0 中可以做到吗? 您的代码无法编译。在这里使用猫鼬 5.9.21。您能否在 repl.it 或其他类似平台上提供一个工作示例?

以上是关于具有 2 个(或更多)模式类型的 mongoose 数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 高级自定义模式对象类型

如何使用 mongoose 填充具有无限嵌套级别的文档

在导出的 Mongoose 模型中使用 Mongoose 模式函数

MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置

Mongoose Typescript 2 Schema 有一个使用其他模式的字段

利用Mongoose来结构化模式与验证