【问题标题】:MongoDB design decision for DocumentsMongoDB 文档设计决策
【发布时间】:2020-02-04 04:03:51
【问题描述】:

我正在为一个小型社交网络构建一个 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"
      }
   ]

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

【问题讨论】:

  • 您可以在这两种方法中查询关系的任一方(但我不能告诉您为此的猫鼬代码)。不过,为什么不将链接存储在自己的文档中呢?
  • 那么像一个连接表?我的意思是它可以正常工作,但我认为在 mongoDB 中你不使用连接表,因为它不是关系数据库?
  • 好吧,不管是否是关系型的,但在这里这种方法看起来比其他两种方法更好(恕我直言,自然)。

标签: mongodb express mongoose database-design mongodb-query


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您要通过 userid 进行大量查询,您可以在收藏夹文档中添加一个 userid 列。这将节省查询/加入/聚合

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2011-03-04
      • 2011-04-18
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多