假设我们有用户和帖子集合。在收集后,投票将用户名存储为密钥。
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个集合的方法。 是否有可能实现重新减少?
我知道在帖子中嵌入用户文档非常简单,但这不是一个好方法,因为真正的用户文档有很多属性。如果我们包含用户文档的简化版本,它将限制分析的维度。
{Title:'Title1', vote:[{name:'a', age:12}]}
答案 0 :(得分: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。
答案 1 :(得分:0)
而不是
{name:'a', age:12}
向用户文档添加新字段并在每次投票更新中维护它更容易。当然,您可以使用map reduce来分析您的数据。
{name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]}