【问题标题】:MongoDB query by foreign keyMongoDB外键查询
【发布时间】:2023-03-08 00:02:01
【问题描述】:

我有两个收藏:

用户:

  • { id:"aaaaaa" 年龄:19 , 性别:"f" }
  • { id:"bbbbbb" 年龄:30 , 性别:"m" }

评论:

  • { id:777777 , user_id:"aaaaaa" , text:"一些评论数据" }
  • { id:888888 , user_id:"aaaaaa" , text:"一些评论数据" }
  • { id:999999 , user_id:"bbbbbb" , text:"一些评论数据" }

我想查找sex=fage>18 的所有评论

(我不想嵌套,因为评论集合会很大)

【问题讨论】:

    标签: node.js mongodb schema-design


    【解决方案1】:

    您应该在每条评论中包含用户数据(也称为非规范化):

    { id:777777 , user: { id:"aaaaaa", age:19 , sex:"f" } , text:"some review data" }
    { id:888888 , user: { id:"aaaaaa", age:19 , sex:"f" } , text:"some other review data" }
    { id:999999 , user: { id:"bbbbbb", age:20 , sex:"m" } , text:"mome review data" }
    

    在这里,阅读这个link on MongoDB Data Modeling

    关于非规范化的说明

    关系纯粹主义者可能已经感到不安,就好像我们是 违反某些普遍规律。但请记住,MongoDB 集合不等同于关系表;每个服务一个 独特的设计目标。规范化表提供了一个原子的、 孤立的数据块。然而,一份文件更接近地代表 一个整体的对象。在社交新闻网站的情况下,它可以是 辩称用户名是发布的故事所固有的。

    如何更新用户名?确实,这样的更新将 贵;幸运的是,在这种情况下,它们将很少见。读取节省 在非规范化方面取得的成就肯定会超过 不定期更新。唉,这不是硬性规定:最终, 开发人员必须评估他们的应用程序的适当级别 归一化。

    【讨论】:

    • 谢谢。如果 USER 数据发生变化,此模型将要求我们为每个 REVIEW 手动更新所有嵌套的 USER 数据。如果我们在嵌套数据上建立索引,那么索引也必须重建。对于拥有 1000 条评论的用户,任何 USER 数据更改都需要更新 1000 条记录。
    • 没错。这就是缺点。如果您走这条路,您更新用户信息的所有内容,您都必须继续其他记录的更新。因此,您必须决定要在权衡的哪一边:大量更新或大量查询。这完全取决于你做得更多。
    • 您预计用户数据的哪一部分会发生变化?性别?不太可能。年龄?您真的想存储他们当前的年龄还是他们创建评论时的年龄?
    【解决方案2】:

    除非您使用搜索属性对 REVIEWS 集合进行反规范化,否则 MongoDB 不支持在单个查询中查询另一个集合。 See this post.

    【讨论】:

    • DBREF 怎么样?这不算查询另一个集合?
    • 您仍然仅限于查询 $id 或 _id。对于其他字段,您需要执行另一个查询。此外,DBRef 是resolved client-side,根据您的驱动程序,可能支持也可能不支持自动补水。这意味着,无论如何,您最终都会执行另一个查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2021-04-06
    • 2011-02-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多