在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
}
});
注释在哪里是ObjectId数组?
我想我的问题确实是,Mongoose会为每个模式创建一个集合还是将其实际上只是将评论嵌入到BlogPost中?
我之所以问是因为,目前在一个正在执行的项目中,我有一个架构,该架构具有一个表示用户的ObjectId数组。我想知道,如果可以声明一个用户数组,而不是声明一个ObjectId数组。
最佳答案
是的,有很大的不同,您的猜测是正确的。
第一个版本只是将评论嵌入到BlogPost中,MongoDb中只有一个集合("BlogPosts")
。如果删除BlogPost,则其所有注释也将被删除,因为它们仅存在于BlogPost中。一个评论只能在一个BlogPost中。这称为“嵌入式子文档”
第二版创建参考。因此,您的BlogPost引用了注释。从理论上讲,同一条评论可以被多个博客文章引用。如果您删除BlogPost,则它所引用的评论将很高兴地存在。这称为“参考文档”:http://mongoosejs.com/docs/populate.html
最后一个问题:对于用户来说,嵌入可能不是正确的解决方案,因为您可能还需要在其他地方和独立使用用户。如果嵌入,通常会创建冗余重复项。对于确实存在于其他对象中并且未被其他地方引用/使用的对象(例如,BlogPost的评论),嵌入通常是一个很好的解决方案。
关于javascript - 使用嵌入式文档列表或ObjectIds列表有区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33766314/