【问题标题】:Mongodb Schema for Posts and Shares用于帖子和共享的 Mongodb 模式
【发布时间】:2018-02-26 00:24:48
【问题描述】:

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

【问题讨论】:

  • 我仍然不清楚为什么第一个选项不可行。我同意 mongodb 不支持 join 进行在线查询。但是,使用此post,您可以将 join 用于离线进程。第一种选择如何破坏目的尚不清楚。你能详细说明一下吗?
  • MapReduce 技术返回一个 BSON 文档,它的大小可以是最大 16mb,所以我的帖子数量和每个帖子的共享数量可能会增加,并且可能会达到 16mb 大小的结果文档
  • 好的。关于 map-reduce 用例,我同意你的看法。但是我仍然无法理解为什么第一个选项没有帮助。我的意思是,如果您能够定义您的 api 请求或用例,那就更清楚了。
  • @SIDDHARTHJMEHTA 获得的最终结果将包含一个文档,该文档将具有一个 shares 数组,并且每个数组都可以有许多文档,所以同样
  • @SIDDHARTHJMEHTA。我想收到用户关注者的帖子和分享(在两者中搜索 postedByshareBy 并根据 Date 排序)所以我需要也要查看这些并根据时间返回它们中的每一个

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


【解决方案1】:

好的。我建议以下方法:

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

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

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

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

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

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

【讨论】:

  • 这里还有一个问题:虽然我得到 postsshares 分别按排序顺序,但我需要进一步排序混合帖子和共享. 例如:如果 ( A ) 在上午 9 点发布,则已在下午 3 点共享 ( A1 ),而 B 则在下午 12 点发布。根据你的逻辑,我会得到 A 然后 A1 而不是 B 但我需要 A 然后 B 然后 A1 的顺序。
  • 好的,据我了解,您必须编写自定义逻辑来合并这些共享/帖子。如果您将所有记录附加到一行中,mongo 的 map-reduce 工具将无济于事。但是,如果您处理它以使帖子/共享的单个记录是单行,则可以使用 MR 来完成。最后,您必须编写自定义逻辑才能做到这一点。
【解决方案2】:

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

【讨论】:

  • 好吧,我该如何使用选项 2 来做到这一点,请牢记这一点:这里还有一个问题:虽然我分别按排序顺序获取帖子和分享,但我需要进一步排序混合帖子和分享。例如:如果(A)在上午 9 点发布,则在下午 3 点共享(A1),而 B 在下午 12 点发布。根据你的逻辑,我会得到 A 然后 A1 而不是 B 但我需要顺序 A 然后 B 然后 A1
  • 为此您必须编写自定义代码。从您想要的两个集合中获取文档,然后按您需要的顺序合并它们。
  • 我应该如何合并它们......使用聚合或任何其他方式?
  • 你必须用你使用 nodejs 或 java 的任何语言编写代码。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多