【问题标题】:mongoose array with 2 (or more) schema types具有 2 个(或更多)模式类型的 mongoose 数组
【发布时间】: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,
});

【问题讨论】:

    标签: arrays node.js mongodb mongoose schema


    【解决方案1】:

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

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

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

    2. 使用鉴别器。基本上,您的示例需要三个 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 或其他类似平台上提供一个工作示例?
    猜你喜欢
    • 2013-02-09
    • 2015-11-09
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2019-11-29
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多