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”)
。如果你删除一篇博客文章,它的所有评论也会被删除,因为它们只存在于博客文章中。一条评论只能包含在一篇博客文章中。这称为“嵌入式子文档”

第二个版本创建引用。所以你的博客文章引用了这些评论。理论上,同一条评论可以被多篇博客文章引用。如果你删除了一篇博客文章,被它引用的评论将很快继续存在。这称为“参考文件”:

关于最后一个问题:对于用户来说,嵌入可能不是正确的解决方案,因为您可能还需要在其他位置和独立位置使用您的用户。如果嵌入,通常会创建冗余的重复项。嵌入通常是一个很好的解决方案,适用于真正存在于其他对象中的对象,而不是从其他地方引用/使用的对象(例如博客帖子的评论)。

我通常建议