Mongodb Schema for Posts and Shares

时间:2017-09-17 10:00:13

标签: mongodb mongodb-query aggregation-framework mongoose-schema nosql-aggregation

我是mongodb NoSQL 概念的新手,并且我无法决定是否可以最好地为我的目的建立架构。

我需要设计架构,使得我的最终结果为按时间排序的帖子和份额。为此我考虑了两个选择:

选项1:不同的帖子和分享集合

收集后的架构

var postSchema = mongoose.Schema({
   postText: String,
   postedBy: String, 
   privacy: Number,
   updatedOn: { type: Date, default: Date.now }        
}, { collection: 'posts' }); 

分享收藏架构

var shareSchema = mongoose.Schema({
   dis_Id: { type: mongoose.Schema.Types.ObjectId }, // Id of post that is shared
   shareBy: { type: mongoose.Schema.Types.ObjectId },
   shareText: String,
   share_privacy: Number,
   shareOn: { type: Date, default: Date.now }
}, { collection: 'shares' });

选项2:在帖子中嵌入分享

发布的新架构

var postSchema = mongoose.Schema({
  postText: String,
  postedBy: String,
  updatedOn: { type: Date, default: Date.now }, 
  privacy: Number,
  share: {
    shareBy: { type: mongoose.Schema.Types.ObjectId },
    shareText: String, 
    share_privacy: Number,
    shareOn: { type: Date } 
  }       
}, { collection: 'posts' });

现在哪一个可能是更好的选择?选项1在查询时遇到问题,因为mongodb中没有连接,选项2将导致复制相同的数据,并且可以为数十万用户增长到数十亿以上。

2 个答案:

答案 0 :(得分:0)

确定。我建议采用以下方法:

  1. 由于您已拥有用户名,因此您可以使用sort按排序顺序检索与该ID对应的帖子列表。

  2. 对每个帖子进行迭代,您可以使用上面使用的相同排序按排序顺序获取共享。

  3. 这里的关键是理解你要设置的索引。我建议你应该有以下索引。

    post_schema: {username,updatedOn}上的复合索引

    share_schema: {dis_Id,shareOn}上的复合索引。

    如果未使用复合索引,则您的应用程序将无法扩展到大量记录。

答案 1 :(得分:0)

当你将所有必需的数据放在一起时,很容易使用嵌入式文档,因此选项2在这种情况下是好的。但是,如果您担心文档的大小增加超过16MB,那么请选择1.在这种情况下,不要使用聚合查询来连接两个集合,因为这将是耗时的操作,因为它将首先执行所有操作然后执行跳过操作。相反,您应该单独查询每个集合,并使用一些自定义逻辑自行创建完整的响应。