Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb mapreduce-在reduce中构建数组或对象?_Mongodb_Mapreduce - Fatal编程技术网

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