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/

10-11 12:01