繁体   English   中英

在MongoDB中进行查询和排序以实现多对多关系

[英]Query and Sort in MongoDB for a many-to-many relationship

假设我在userspostslikes之间有关系。 一个用户可以喜欢一个帖子,而一个帖子可以被许多用户喜欢。

我的目标是能够在MongoDB中设计一个数据库结构,以便我可以快速查询用户喜欢的所有帖子,并以下面列出的多种方式对它们进行排序/过滤(不能同时使用-考虑一个下拉菜单,您可以更改搜索结果的排序顺序)

  1. 喜欢帖子的顺序
  2. 按各种post属性进行过滤和排序-例如标题,帖子回复数,帖子创建时间等

假设帖子的数量在100,000个左右,每个帖子的赞数在100-1000个左右

我想到的可能的解决方案:

1) likes被嵌入posts

这使#2可以轻松处理,因为您只是在likes.user_id以及所需的其他任何post属性上都有一个索引。 这也很快,因为您只需要运行一个查询。

但是,这使得无法按用户喜欢的时间进行分类(AFAIK)。

2) likes是具有属性post_idaccount_id的单独集合。

由于您可以按_id排序,因此可以轻松处理#1。 但是,除非您将post属性复制并缓存到like文档中,否则将无法处理#2。 这是可能的,但实际上并不理想。 此外,这查询起来较慢。 您需要运行两个查询-一个查询like集合,然后使用$ in进行post查询:[post_ids]。

我还应该考虑其他解决方案/设计吗? 我在这些建议的解决方案中缺少任何内容吗?

我将使用#2的非规范化版本。 有一个like文件:

{
    "_id" : ObjectId(...),
    "account_id" : 1234,
    "post_id" : 4321,
    "ts" : ISODate(...),
    // additional info about post needed for basic display
    "post_title" : "The 10 Worst-Kept Secrets of Cheesemongers"
    // etc.
}

随着指数{ "account_id" : 1, "ts" : 1 }则可以有效地找到like由像时间排序特定用户的文档。

db.likes.find({ "account_id" : 1234 }).sort({ "ts" : -1 })

如果将有关帖子的基本信息放入like文档中,则无需检索帖子文档,直到用户单击链接以显示整个帖子。

折衷是,如果某个帖子的某些like嵌入的信息发生更改,则需要在每个“ like进行更改。 这可能什么都不是,也可能很麻烦,这取决于您选择嵌入的内容以及帖子在收到很多喜欢后被修改的频率。

您的第一选择对我来说似乎很不错。 它很好地满足了您的两个需求。 如,

  1. 您需要根据发布,评论的属性对评论,发布进行排序,这可以通过聚合实现
  2. 您需要根据某些属性来过滤文档(帖子),这也是可能的。

2个集合的缺点是您需要运行2个查询来获取一条数据。 NoSQL数据库使您可以灵活地将相关数据存储在一个位置,并提供最佳的性能。 不使用NoSQL的好处,您将无法获得优化的性能。

不要从RDBMS角度考虑(忘记标准化)。 如果您需要使用第一个选项进行更多性能优化,则可以使用索引,分片(使用分片键作为字母范围,地理位置等)。

暂无
暂无

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

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