mongodb mapreduce-在reduce中构建数组或对象?
原始收藏:mongodb mapreduce-在reduce中构建数组或对象?,mongodb,mapreduce,Mongodb,Mapreduce,原始收藏: { "_id" : ObjectId('xxxxxxxxxxxxxxxx'), "userId" : ObjectId('yyyyyyyyyyyyyyyy'), "urlId" : ObjectId('zzzzzzzzzzzzzzzzzz') }, { "_id" : ObjectId('uuuuuuuuuuuuuuuuuu'), "userId" : ObjectId('aaaaaaaaaaaaaaaa'), "urlId" : ObjectId('zzzz
{
"_id" : ObjectId('xxxxxxxxxxxxxxxx'),
"userId" : ObjectId('yyyyyyyyyyyyyyyy'),
"urlId" : ObjectId('zzzzzzzzzzzzzzzzzz')
},
{
"_id" : ObjectId('uuuuuuuuuuuuuuuuuu'),
"userId" : ObjectId('aaaaaaaaaaaaaaaa'),
"urlId" : ObjectId('zzzzzzzzzzzzzzzzzz')
}
发射:
减少:
function(key, values) {
var visitCount = 0;
var userVC = new Array();
values.forEach(function(doc) {
NOT SURE WHAT TO PUT HERE TO ACHIEVE DESIRED OUTPUT COLLECTION
});
return {urlId: key, userVC: userVC};
};
所需的MR输出集合:
{
"_id" : ObjectId('zzzzzzzzzzzzzzzzzzzz'),
"value" : {
"urlId" : ObjectId('zzzzzzzzzzzzzzzzzzzz'),
"userVC" : {
ObjectId('yyyyyyyyyyyyyyyy') : <total visit count for this userId on this urlId>,
ObjectId('aaaaaaaaaaaaaaaa') : <total visit count for this userId on this urlId>
}
}
{
“_id”:ObjectId('zzzzzzzzzzzzzzzzzz'),
“价值”:{
“urlId”:ObjectId('zzzzzzzzzzzzzzzzzz'),
“用户VC”:{
ObjectId('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,
ObjectId('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
}
}
你想知道每个用户访问你网站上每个url的次数吗?我想你会想以不同的方式解决这个问题
发出url/用户访问次数:
emit( { urlId: this.urlId, userId: this.userId }, { count: 1 } );
用reduce计算它们:
r = function( key , values ){
var total = 0;
for ( var i=0; i<values.length; i++ )
total += values[i].count;
return { count : total };
};
r=函数(键、值){
var合计=0;
对于(var i=0;i对于任何试图在reduce函数中解决此问题的人:
function reduce(key, values) {
const result = {
list: [],
...
};
// keep track of reduced records to avoid duplicate list entries
const processed = {
list: [],
...
};
values.forEach((value, index) => {
if (value.listItem && value.listItem.length > 0) {
// our value is an array as MongoDB needs to be strongly typed (same as reduced type)
if (processed.list.indexOf(value.listItem[0].key) === -1) {
result.list = result.list.concat(value.listItem);
}
}
...
});
return result;
}
reduce函数在MongoDB的上下文中运行,因此您需要了解支持的函数中的内容。第二个map reduce操作可用于将具有user键和url的集合转换为具有user键和计数数组的值的集合。由于您将一个集合分配给计数,因此可以为(var i=0;iNot so@Danielo515。我们在映射中分配计数1,但是减少可以以任意顺序发生多次,将映射中发出的值与以前从子集中减少的值混合。换句话说,在减少函数中,计数并不总是一。
function reduce(key, values) {
const result = {
list: [],
...
};
// keep track of reduced records to avoid duplicate list entries
const processed = {
list: [],
...
};
values.forEach((value, index) => {
if (value.listItem && value.listItem.length > 0) {
// our value is an array as MongoDB needs to be strongly typed (same as reduced type)
if (processed.list.indexOf(value.listItem[0].key) === -1) {
result.list = result.list.concat(value.listItem);
}
}
...
});
return result;
}