Mongodb 多个集合的最佳做法

Mongodb best practices for multiple collections

在一个论坛类型的网站上,我有两个彼此密切相关的集合。 userslikes.

likes: {
  _id:5fa9ba086259f619f7d9f82b
  postId:"7A0A"
  author:"e3fc0911-b708-481e-b4fb-8c1c60a57c3d"
}

user: {
  _id:"51c6cc3b-6951-45c5-bf07-cfe86fccbbd5"
  username:"sun"
}

每次获取用户时,我都想显示该用户的总点赞数。到目前为止,我已经用投影解决了这个问题。我会得到作者。获取喜欢的数量并使用投影将其组合。

[{
    $lookup: {
        from: 'likes',
        localField: '_id',
        foreignField: 'author',
        as: 'likes'
    }
}, {
    $project: {
        author: 1,
        username: 1,
        likeAmount: {
            $size: '$likes'
        },
    }
}]

此 returns 具有特定用户的点赞数的用户对象。

在我开始添加更多功能之前,它一直运行良好。新功能是 posts。现在,对于每个 post,我想查询 post 的作者,并与作者一起查询喜欢的内容。每个功能都开始变得越来越复杂。

我担心很快我将达到嵌套引用的限制,我无法再与投影数据进行交互。

Idea1:分解前端的 API 调用。所以 post 不会自动让用户使用它。前端必须先获取 post。然后根据userId查询用户。

Idea2:在用户中保留一个运行 likeAmount 属性,它会随着给定用户的每一个like而增加。 (更多字段保持更新,重复数据)

在 mongodb 中处理此类结构的最佳方法是什么?

这个问题比较隐晦,但我相信您需要有关如何组织集合的建议。

  • 反模式之一是将您通常一起查询的不同内容存储在一起。

如果你说“每次我想要一个用户我也想要喜欢的人”,那应该在同一个集合中。

  • Atlas 和 Compass 向您展示反模式。

他们会在你查询数据库次数足够多后对你的查询进行分类,并告诉你是否有问题。


如果你确实需要查找+过滤,有一个巧妙的方法:

{
   $graphLookup: {
      from: <collection>,
      startWith: <expression>,
      connectFromField: <string>,
      connectToField: <string>,
      as: <string>,
      maxDepth: 0,
      restrictSearchWithMatch: <document>
   }
}

您的查询在哪里,例如。 {abdominals:null}。我故意设置 maxDepth:0 因为看起来你可以使用它,但 maxDepth 只是 <number>

请记住,对于快速应用程序来说,查找可能是不受欢迎的。

MongoDB 有一个 video on this topic.