Mongoose中嵌套Schema的不同方法之间的澄清和区别

时间:2014-04-12 06:02:08

标签: mongodb mongoose

我试图在Schema中嵌入Schema,我在Stackoverflow中找到了多种方法,我想知道差异是什么

Mongoose schema within schema

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

由于

1 个答案:

答案 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提供的。