Mongodb多个集合的最佳做法

时间:2020-11-11 23:13:54

标签: mongodb database-design

在论坛类型的网站上,我有两个彼此密切相关的集合。 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'
        },
    }
}]

这将返回带有特定用户点赞次数的用户对象。

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

我担心很快就会遇到无法与投影数据交互的嵌套引用的限制。

Idea1:分解前端的API调用。因此,发布不会自动吸引用户。前端必须先获取帖子。然后根据userId询问用户。

Idea2:在User中保持运行的likeAmount属性,对于给定的用户,每次赞都会增加。 (更多字段可保持更新,重复数据)

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

1 个答案:

答案 0 :(得分:1)

这个问题相当神秘,但是我相信您想要有关如何组织馆藏的建议。

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

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

  • 地图集和指南针向您展示反模式。

在您查询数据库足够的时间之后,它们会对您的查询进行分类,并告诉您是否有问题。


如果您确实需要查找+过滤器,可以使用以下一种整齐的方法:

{
   $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