使用嵌入式文档列表或使用ObjectIds列表之间有区别吗?

时间:2015-11-17 20:25:18

标签: javascript node.js mongodb mongoose

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
    }
});

其中评论是一个ObjectIds数组? 我想我的问题是,Mongoose会为每个Schema创建一个集合,还是实际上只是将评论嵌入到BlogPost中?

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

1 个答案:

答案 0 :(得分:1)

是的,有一个很大的区别,你的猜测是正确的。

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

第二版创建参考。所以你的BlogPost引用了评论。从理论上讲,多个博客帖子可以引用同一个评论。如果删除BlogPost,它所引用的注释将很乐意继续存在。这被称为"参考文件":http://mongoosejs.com/docs/populate.html

对于您的上一个问题:嵌入可能不是用户的正确解决方案,因为您可能还需要其他地方的用户并且是独立的。如果你嵌入你经常创建冗余重复。对于真正存在于其他对象中但未在其他地方引用/使用的对象(例如,BlogPost的注释),嵌入通常是一个很好的解决方案。