使用embedded式文档列表还是使用ObjectId列表有什么不同?

在Mongoose文档中,我遇到了这个例子:

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为每个模式创build一个集合,或者实际上是否将注释embedded到BlogPost中?

我问,因为目前,我正在做一个项目,我有一个架构,有一个ObjectIds数组代表用户。 我想知道,而不是声明一个ObjectIds数组,如果我可以声明一个用户数组。

是的,有很大的差别,你的猜测是正确的。

第一个版本只是将注释embedded到BlogPost中,MongoDb中只有一个集合("BlogPosts") 。 如果删除一个BlogPost,它的所有注释也会被删除,因为它们只存在于BlogPost内部。 一个评论只能在一个BlogPost里面。 这被称为“embedded式子文档”

第二个版本创build引用 。 所以你的BlogPost引用评论。 理论上,同一个评论可以被多个博客文章引用。 如果你删除了一个BlogPost,它所引用的评论将愉快地活着。 这被称为“引用文档”: http : //mongoosejs.com/docs/populate.html

对于您的最后一个问题:embedded可能不是用户的正确解决scheme,因为您可能还需要其他地方的用户和独立的用户。 如果你embedded你经常创build冗余重复。 对于真正存在于其他对象中的对象,embedded通常是一个很好的解决scheme,而不是从其他地方引用/使用(例如BlogPost的评论)。