【问题标题】:MongoDB modeling for efficient join用于高效连接的 MongoDB 建模
【发布时间】:2019-06-27 05:27:12
【问题描述】:

我有两个收藏。

用户

  • user_id
  • user_pw
  • 地区
  • 生日
  • 类别
  • 得分
  • created_at
  • updated_at

帖子

  • post_id
  • user_id
  • 主题
  • 身体
  • 附件
  • created_at
  • updated_at

(User 和 Posts 集合都有 2000000 个文档)

在这种情况下,我必须过滤一些条件以使用 Posts 提取 User

条件

  1. gte
  2. gte
  3. 地区 = '美国'

(每个条件的范围因用户而异)

所以我先提取过滤后的用户。

db.users.distinct("user_id", 
    {
      "region": "US", 
      "score": {"$lte": `SOME_VALUE`, "$gte": `SOME_VALUE`}, 
      "birdhay": {"$lte": `SOME_VALUE`, "$gte": `SOME_VALUE`}
    }
)

并通过过滤的用户提取帖子。

db.posts.find({"user_id": {"$in": [FILTERED_USER_LIST]}}).order_by('post_id').limit(10)

但随着服务的发展,帖子和用户数据将会增加。

然后速度会变慢,也会出现内存问题 (目前,已经很慢了。上面的查询花费了差不多 2~3 秒)

我从第一个建模阶段就认为这是错误的。

问题

  1. 这是在 mongodb 中执行 join 的通用方式吗?

  2. 是否有任何好的建模参考必须通过大量集合执行?

  3. 还有其他性能改进吗?

任何建议,非常感谢。

【问题讨论】:

  • 您是否有要搜索的索引字段?
  • @Sohan 是的。我已经触发了索引。

标签: mongodb


【解决方案1】:

我的建议是重新设计架构,因为您为 UserPosts 设计的架构类似于 RDBMS 数据库中的典型规范化表,例如由外键约束相关的表 User 和表 Posts。

MongoDB 是一个 NoSQL 数据库,因此优化的架构设计是将 User 嵌入到 Posts 集合中,以便您将用户的详细信息与 Post 一起获得。 即使我们将用户记录/数据复制到多个帖子中,它也会更有效率。

【讨论】:

  • 您的意思是,使用 EmbeddedDocument 将 user 数据插入到 posts。对吗?
  • 没错,这样你就可以避免加入,你的表现会更好
  • 您知道,我认为存在某些问题。 1. 重复的User 数据(你提到过) 2. 如果User 数据更改,必须访问Post EmbeddedField 并更改数据。 (我用的是批量操作,所以猜不出有没有错误) 3.相关 1、2.如果用户有很多帖子,每个用户数据的变化都会影响太多帖子。我不知道这是更好的方法。因为用户数据的变化非常周期性。
猜你喜欢
  • 2014-09-14
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2019-12-20
  • 2013-10-21
  • 2018-10-25
相关资源
最近更新 更多