我试图在Schema中嵌入Schema,我在Stackoverflow中找到了多种方法,我想知道差异是什么
var TaskSchema = new Schema({
user : Schema.ObjectId
});
Is it possible to reference two schemas to eachother in Mongoose?
var emailSchema = new Schema({
Subject : FoodItemSchema,
FoodItems : [FoodItemSchema],
Owner : { type : Schema.Types.ObjectId , ref: "User" }
});
我不明白为什么你不能做以下事情来完成任务
var TaskSchema = new Schema({
user : UserSchema
});
或
var emailSchema = new Schema({
Subject : FoodItemSchema,
FoodItems : [FoodItemSchema],
Owner : { type : OwnerSchema , ref: "User" }
});
我很困惑
之间有什么区别Schema.Types.ObjectId
和
Schema.ObjectId
由于
答案 0 :(得分:2)
这两个陈述之间没有真正的区别,正确的是它实际上是Schema.Types.ObjectId
,但另一种形式是为了方便起见。或者您甚至可以直接导入它。
现在,以下内容在实施方面存在明显差异:
var emailSchema = new Schema({
Subject : FoodItemSchema,
FoodItems : [FoodItemSchema],
Owner : { type : Schema.Types.ObjectId , ref: "User" }
});
在引用FoodItemSchema
的项目中,实际执行的内容是"embed"文档中所代表的文档。在一种形式中作为简单的子文档,在另一种形式中作为这些子文档的数组。
这是MongoDB的一个功能,您可以在其中保持与相关的#34;文件信息"在"实际的文件本身。在许多情况下,这是最有效的方法。
但是在字段Owner
的另一种形式中,保留的所有内容都是文档_id
,其中"指的是"到单独集合中的项目,其中"User"
是所用模式的名称。通常,这将与数组一起使用,但在这种情况下,它只是一个文档引用。
因此,emailSchema
模型中实际存储的文档实际上并不包含"用户"信息而不是"嵌入式"形成。所包含的只是存在于单独集合中的文档的_id
值。
Mongoose提供populate
方法以允许"合并"将来自其他集合的文档转换为本文档中的检索。结果它将出现"好像文件实际上是嵌入式的。
但是人口虽然很方便,但实际上只是带着一个额外的查询或查询回到数据库,以便获取" fetch"那些信息。因此,根据您的需求,这可能是性能问题。
所以这应该基本上解释差异。您还可以查看给出的文档参考,以获取更多示例。在Data Modelling上的MongoDB文档中还有一个很好的部分,它讨论了使用嵌入或交替使用"链接引用的各种方法"比如Mongoose提供的。