具有 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 模式函数
MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置