Javascript 使用嵌入文档列表和使用objectid列表之间有区别吗?
在本文中,我遇到了以下示例:Javascript 使用嵌入文档列表和使用objectid列表之间有区别吗?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,在本文中,我遇到了以下示例: var Comments = new Schema({ title : String , body : String , date : Date }); var BlogPost = new Schema({ author : ObjectId , title : String , body : String , date : Date , comments :
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
}
});
其中,注释是一个objectid数组?
我想我的问题是,Mongoose会为每一个模式创建一个集合,还是实际上只是将注释嵌入BlogPost
我这样问是因为目前,在我正在做的一个项目中,我有一个模式,它有一个表示用户的objectid数组。我想知道,我是否可以声明一个用户数组,而不是声明一个objectid数组。是的,有很大的区别,你的猜测是正确的 第一个版本只是将评论嵌入到BlogPost中,MongoDb中只有一个集合
(“BlogPost”)
。如果你删除一篇博客文章,它的所有评论也会被删除,因为它们只存在于博客文章中。一条评论只能包含在一篇博客文章中。这称为“嵌入式子文档”
第二个版本创建引用。所以你的博客文章引用了这些评论。理论上,同一条评论可以被多篇博客文章引用。如果你删除了一篇博客文章,被它引用的评论将很快继续存在。这称为“参考文件”:
关于最后一个问题:对于用户来说,嵌入可能不是正确的解决方案,因为您可能还需要在其他位置和独立位置使用您的用户。如果嵌入,通常会创建冗余的重复项。嵌入通常是一个很好的解决方案,适用于真正存在于其他对象中的对象,而不是从其他地方引用/使用的对象(例如博客帖子的评论)。我通常建议