在这个问题的答案的基础上, Nested arrays in Mongoose
我想知道是否有一种方法可以在mongoose模式中使用一个数组,该模式只接受两种类型的模式定义文档中的一种作为数组中的元素。这是什么意思?考虑定义为...的模式。
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,
});
答案 0 :(得分:4)
基本上有两种方法可以做到这一点:
将Stuff和OtherStuff存储在另一个自己的集合(同一个集合)中,并且只存储字段中对象的id,然后可以填充结果。这个解决方案的技巧是你要创建两个指向同一集合的猫鼬模型。
注意:此解决方案适用于大型且差异很大的Stuff和OtherStuff对象(因为mongoDb存储启发式),文档数量较少(因为填充是一个缓慢的过程)。最终,如果对象非常不同,他们应该拥有自己的领域。
使用鉴别器。基本上,您的示例需要三个文档模式(其他模式保持不变):
// -- 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);
}
注意:这是与多态对象一起使用的解决方案,这些对象看起来很相似,对于doc中的大N来说速度很快。