Mongodb map reduce跨2个集合



假设我们有用户和帖子收集。在post collection中,投票将用户名存储为键。

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]});

我们想按邮政分组。标题,并找出不同用户年龄的投票计数。

> {_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个集合。有可能实现再减少吗?

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

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

MongoDB没有多集合Map/Reduce。MongoDB没有任何JOIN语法,可能不太适合临时连接。您需要以某种方式对这些数据进行反规范化。

你有几个选择:

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

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

选项#2:保存年龄计数器

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

选项#3:执行"manual" join

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

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

我的建议

选择#1或#2。

代替

{name:'a', age:12}

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

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

相关内容

  • 没有找到相关文章

最新更新