针对多个集合的Mongodb最佳实践

针对多个集合的Mongodb最佳实践,mongodb,database-design,Mongodb,Database Design,在一个论坛类型的网站上,我有两个彼此密切相关的收藏用户和喜欢 likes: { _id:5fa9ba086259f619f7d9f82b postId:"7A0A" author:"e3fc0911-b708-481e-b4fb-8c1c60a57c3d" } user: { _id:"51c6cc3b-6951-45c5-bf07-cfe86fccbbd5" username:"sun" }

在一个论坛类型的网站上,我有两个彼此密切相关的收藏<代码>用户和
喜欢

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'
        },
    }
}]
这将返回用户对象,其中包含特定用户的喜好数

在我开始添加更多功能之前,它一直工作得相当好。新特性是posts。现在,对于每一篇文章,我都想询问文章的作者,以及类似的作者。每一项功能都开始变得越来越复杂

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

Idea1
:在前端中断API调用。所以post不会自动让用户使用它。前端必须先取邮件。然后根据userId请求用户

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


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

这个问题相当神秘,但我相信您需要关于如何组织集合的建议

  • 反模式之一是将通常一起查询的单独内容存储在一起
如果你说“每次我想要一个用户,我也想要喜欢的”,那应该在同一个集合中

  • 地图册和指南针显示反模式
在您查询数据库足够多次后,它们会对您的查询进行分类,并告诉您是否有问题


如果您确实需要查找+筛选,有一种简洁的方法可以使用:

{
   $graphLookup: {
      from: <collection>,
      startWith: <expression>,
      connectFromField: <string>,
      connectToField: <string>,
      as: <string>,
      maxDepth: 0,
      restrictSearchWithMatch: <document>
   }
}
{
$graphLookup:{
发件人:,
startWith:,
connectFromField:,
connectToField:,
as:,
最大深度:0,
限制搜索与匹配:
}
}
您的查询在哪里,例如
{abdominals:null}
。我特意将maxDepth设置为0,因为您似乎可以使用它,但maxDepth只是

但请记住,对于快速应用程序,查找可能是不可取的


MongoDB有一个带有第二个选项的。

我如何查询当前用户是否对某个帖子进行了投票?