繁体   English   中英

MongoDB 文档设计决策

[英]MongoDB design decision for Documents

我正在为一个小型社交网络构建一个 API,我遇到了一个我必须做出的设计决定。 我正在使用 Express 和 MongoDB 和 mongoose 来处理数据库。

我有两个文档:用户和帖子。 我希望用户能够将帖子标记为他们的收藏夹。 我想出了两种不同的实现方式:

选项 A:将收藏夹保存在用户文档中。 它可以轻松显示用户所有喜欢的帖子。 但是我将如何查询喜欢特定帖子的用户?

UserSchema:
   favorite_posts: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "posts"
      }
   ]

选项 B:保存用户,点击发布文档中的收藏按钮。 这样做的好处是,您可以轻松显示所有收藏帖子的用户。 但是我如何列出一个特定用户标记为收藏的所有帖子。

PostSchema:
   users_favorited: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "users"
      }
   ]

有人可以解释我如何查询这些东西吗? 我没有从文档中变得更聪明...... :(

正如评论中已经提到的那样,您最好的选择是连接表以使:m 关系工作。 ZCCADCDEDB567ABAE643E15DCF0974E503Z 确实通过常规查询中的 populate() 功能或聚合中的 $lookup-step 来模拟 sql 内连接功能。 所以基本上创建一个名为“likes”的表,它只包含对用户和帖子的引用。 使用聚合框架,您可以轻松查询用户的所有喜欢或帖子上的所有喜欢,首先使用 $match 运算符,然后按用户或帖子的 $group 和 $push 创建所有喜欢的数组用户或反之亦然,然后使用 $lookup 步骤加入所需的数据。

但是,正如您所描述的,您可以将所有收藏夹放在用户文档或发布文档的数组中,但除非您确定这些 arrays 不会变大,否则我建议您不要这样做,因为 mongoDb 不是为这种用途而设计的,您很快就会遇到性能问题。 有关更多信息,请参阅http://www.askasya.com/post/largeembeddedarrays/

如果您要通过 userid 查询很多,您可以在收藏夹文档中添加一个 userid 列。 这将节省查询/连接/聚合

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM