3

我有两个收藏:

用户:

  • { 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

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

4

2 回答 2

2

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

{ 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" }

在这里,阅读有关 MongoDB 数据建模的链接

关于非规范化的说明

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

用户名的更新呢?确实,这样的更新会很昂贵。幸运的是,在这种情况下,它们将很少见。在非规范化中实现的读取节省肯定会超过偶尔更新的成本。唉,这不是硬性规定:最终,开发人员必须评估他们的应用程序以获得适当的规范化水平。

于 2012-10-28T19:14:33.830 回答
1

除非您使用搜索属性对 REVIEWS 集合进行反规范化,否则 MongoDB 不支持在单个查询中查询另一个集合。看到这个帖子。

于 2012-10-28T18:52:01.147 回答