【问题标题】:Mongodb map reduce across 2 collectionMongodb地图减少2个集合
【发布时间】:2011-11-01 08:43:25
【问题描述】:

假设我们有用户和帖子集合。在帖子收藏中,投票将用户名存储为key。

db.user.insert({name:'a', age:12});
db.user.insert({name:'b', age:12});
db.user.insert({name:'c', age:22});
db.user.insert({name:'d', age:22});

db.post.insert({Title:'Title1', vote:[a]});
db.post.insert({Title:'Title2', vote:[a,b]});
db.post.insert({Title:'Title3', vote:[a,b,c]});
db.post.insert({Title:'Title4', vote:[a,b,c,d]});

我们想按post.Title分组,找出不同用户年龄的投票数。

> {_id:'Title1', value:{ ages:[{age:12, Count:1},{age:22, Count:0}]} }
> {_id:'Title2', value:{ ages:[{age:12, Count:2},{age:22, Count:0}]} }
> {_id:'Title3', value:{ ages:[{age:12, Count:2},{age:22, Count:1}]} }
> {_id:'Title4', value:{ ages:[{age:12, Count:2},{age:22, Count:2}]} }

我已经搜索并没有找到访问 mongodb mapreduce 中的 2 个集合的方法。 能不能实现in re-reduce?

我知道在 post 中嵌入用户文档非常简单,但这不是一个好方法,因为真正的用户文档有很多属性。如果我们包含用户文档的简化版本,它将限制分析的维度。

{Title:'Title1', vote:[{name:'a', age:12}]}

【问题讨论】:

  • 不可能对多个集合执行 map-reduce。当您对嵌入文档说“这不是好方法”时,还请解释您的理由。如果可能,请提供您的设计考虑因素。

标签: mongodb join mapreduce schema-design


【解决方案1】:

MongoDB 没有多集合 Map/Reduce。 MongoDB 没有任何 JOIN 语法,可能不适用于 ad-hoc 连接。您需要以某种方式对这些数据进行非规范化处理。

你有几个选择:

选项 #1:在投票中嵌入年龄。

{Title:'Title1', vote:[{name:'a', age:12}]}

选项 #2:记录年龄

{Title:'Title1', vote:[a, b], age: { "12" : 1, "22" : 1 }}

选项 #3:“手动”加入

您的最后一个选择是编写脚本/代码,对两个集合执行for 循环并正确合并数据。

因此,您将遍历 post 并输出带有标题和投票列表的集合。然后,您将遍历新集合并通过查找每个 user 来更新年龄。

我的建议

选择 #1 或 #2。

【讨论】:

    【解决方案2】:

    代替

    {name:'a', age:12}
    

    在用户文档中添加新字段并在每次投票更新时维护它更容易。当然,您可以享受使用 map reduce 来分析您的数据。

    {name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2019-09-28
      相关资源
      最近更新 更多