带有2个(或更多)模式types的mongoose数组

基于这个问题的答案, 在Mongoose中嵌套数组

我想知道是否有一种方法来在一个mongoose模式,只接受两种types的模式定义的文件作为数组中的元素的数组中的数组。 这是什么意思? 考虑一个模式定义为…

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

东西被定义为

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

这有效,但是如果我想要我的东西:数组能够包含东西或其他的东西….

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

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

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

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

  1. 将Stuff和OtherStuff存储在另一个自己的集合(同一个集合)中,并只存储字段中的对象的id,然后可以填充结果。 这个解决scheme的诀窍是你想创build两个mongoose模型指向相同的集合。

    注意:这个解决scheme适用于大的,差别很大的Stuff和OtherStuff对象(因为mongoDb存储启发式),文档数量less(因为人口是一个缓慢的过程)。 最终,如果对象是非常不同的,他们应该有自己的领域。

  2. 使用鉴别器。 基本上你需要三个文档模式(其他模式保持不变):

     // -- 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); } 

注意:这是一个解决scheme,用于看起来类似的多态对象,对于doc中的大N是快速的。