0

我是 mongodb NoSQL概念的新手,并且停留在我无法决定对最适合我的目的的模式进行建模的地方。

我需要以这样一种方式设计架构,使我的最终结果为Posts 和 Shares 按时间排序。为此,我考虑了两种选择:


选项 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:在帖子本身中嵌入分享

Post 的新架构

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 将导致相同数据的复制,并且可以为数十万用户增长到数十亿以上。

4

2 回答 2

0

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

于 2017-09-17T14:06:57.283 回答
0

好的。我建议采用以下方法:

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

  2. 遍历每个帖子,您可以使用上面使用的相同排序按排序顺序获取共享。

这里的关键是了解您将要设置的索引。我建议你应该有以下索引。

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

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

如果不使用复合索引,您的应用程序将无法针对大量记录进行扩展。

于 2017-09-17T13:59:13.530 回答