在Mongoose documentation我遇到过这个例子:
var Comments = new Schema({
title : String
, body : String
, date : Date
});
var BlogPost = new Schema({
author : ObjectId
, title : String
, body : String
, date : Date
, comments : [Comments]
, meta : {
votes : Number
, favs : Number
}
});
这样做与此之间有区别:
var Comments = new Schema({
title : String
, body : String
, date : Date
});
var BlogPost = new Schema({
author : ObjectId
, title : String
, body : String
, date : Date
, comments : [Schema.Types.ObjectId]
, meta : {
votes : Number
, favs : Number
}
});
其中评论是一个ObjectIds数组? 我想我的问题是,Mongoose会为每个Schema创建一个集合,还是实际上只是将评论嵌入到BlogPost中?
我问,因为目前,在我正在做的项目中,我有一个Schema,它有一个ObjectIds数组,代表用户。我想知道,如果我可以声明一个用户数组,而不是声明一个ObjectIds数组。
答案 0 :(得分:1)
是的,有一个很大的区别,你的猜测是正确的。
第一个版本只是将评论嵌入到BlogPost中,MongoDb中只有一个集合("BlogPosts")
。如果删除BlogPost,它的所有注释也会被删除,因为它们只存在于BlogPost中。一条评论只能在一个BlogPost中。这称为"嵌入式子文档"
第二版创建参考。所以你的BlogPost引用了评论。从理论上讲,多个博客帖子可以引用同一个评论。如果删除BlogPost,它所引用的注释将很乐意继续存在。这被称为"参考文件":http://mongoosejs.com/docs/populate.html
对于您的上一个问题:嵌入可能不是用户的正确解决方案,因为您可能还需要其他地方的用户并且是独立的。如果你嵌入你经常创建冗余重复。对于真正存在于其他对象中但未在其他地方引用/使用的对象(例如,BlogPost的注释),嵌入通常是一个很好的解决方案。