Node.js 通过外键进行MongoDB查询

Node.js 通过外键进行MongoDB查询,node.js,mongodb,schema-design,Node.js,Mongodb,Schema Design,我有两个收藏: 用户: {id:“AAAAA”年龄:19岁,性别:“f”} {id:“bbbbbb”年龄:30,性别:“m”} 审查: {id:777777,用户_id:“aaaaaa”,文本:“一些审查数据”} {id:888888,用户_id:“aaaaaa”,文本:“一些审查数据”} {id:999999,用户_id:“bbbbbbbb”,文本:“一些审查数据”} 我想查找sex=f和age>18 (我不想嵌套,因为评论集合将非常庞大)除非使用搜索属性对评论集合进行反规范化,否则M

我有两个收藏:

用户:

  • {id:“AAAAA”年龄:19岁,性别:“f”}
  • {id:“bbbbbb”年龄:30,性别:“m”}
审查:

  • {id:777777,用户_id:“aaaaaa”,文本:“一些审查数据”}
  • {id:888888,用户_id:“aaaaaa”,文本:“一些审查数据”}
  • {id:999999,用户_id:“bbbbbbbb”,文本:“一些审查数据”}
我想查找
sex=f
age>18


(我不想嵌套,因为评论集合将非常庞大)

除非使用搜索属性对评论集合进行反规范化,否则MongoDB不支持在单个查询中查询另一个集合

您应该在每次审查中包括用户数据(也称为非规范化):

在这里,请阅读以下内容:

关于非规范化的注记

关系纯粹主义者可能已经感到不安了,就好像我们是 违反了一些普遍规律。但让我们记住MongoDB 集合不等同于关系表;每人供应一份 独特的设计目标。规范化表提供了一个原子, 孤立的数据块。然而,一份文件更能代表 作为一个整体的物体。就社交新闻网站而言,它可以是 认为用户名是发布故事的固有属性

用户名的更新情况如何?确实,这样的更新将 价格昂贵;幸运的是,在这种情况下,它们将是罕见的。阅读储蓄 在非规范化方面取得的成就肯定会超过 偶尔更新。唉,这不是硬性规定:最终, 开发人员必须评估其应用程序的适当级别 正常化进程


DBREF呢?这不算作查询另一个集合?您仍然只能查询$id或_id。对于其他字段,您需要执行另一个查询。此外,DBRef可能支持自动水合,也可能不支持自动水合,具体取决于您的驱动程序。也就是说,你最终还是要做另一个查询。谢谢。如果用户数据发生更改,此模型将要求我们为每次审查手动更新所有嵌套的用户数据。如果我们在嵌套数据上建立索引,那么也必须重新构建索引。对于具有1000次审核的用户,任何用户数据更改都需要更新到1000次记录。确切地说。这就是缺点。如果你要走这条路,所有你更新用户信息的东西,你必须继续其他记录的更新。因此,您必须决定要在哪一方面进行权衡:大量更新还是大量查询。这完全取决于你做的更多。你希望用户数据的哪一部分会改变?性?不大可能发生的年龄?您真的想存储他们当前的年龄还是他们创建评论时的年龄?
{ 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" }