Mapreduce couchdb map/reduce视图:仅计算最近的项目

Mapreduce couchdb map/reduce视图:仅计算最近的项目,mapreduce,couchdb,Mapreduce,Couchdb,我有以下文件。关键词的时间戳位置 { _id: willem-aap-1234, keyword:aap, position: 10, profile: { name: willem }, created_at: 1234 }, { _id: willem-aap-2345, keyword:aap, profile: { name: willem }, created_at: 2345 }, { _id: oliver-aap-1235, keywo

我有以下文件。关键词的时间戳位置

{
  _id: willem-aap-1234,
  keyword:aap,
  position: 10,
  profile: { name: willem },
  created_at: 1234
},
{
  _id: willem-aap-2345,
  keyword:aap,
  profile: { name: willem },
  created_at: 2345
},
{
  _id: oliver-aap-1235,
  keyword:aap,
  profile: { name: oliver },
  created_at: 1235
},
{
  _id: oliver-aap-2346,
  keyword:aap,
  profile: { name: oliver },
  created_at: 2346
}
可以通过以下方式查找每个profile.name的最新关键字:

map: function(doc) {
if(doc.profile)
    emit(
        [doc.profile.name, doc.keyword, doc.created_at], 
        { keyword : doc.keyword, position : doc.position, created_at: doc.created_at }
    );
}

reduce: function(keys, values, rered) {
  var r = values[0];
  for (var i=1; i<values.length; i++)
    if (r.created_at < values[i].created_at)
      r = values[i];
  return r;
}
这为我提供了名为aname的概要文件的最新文档

但现在我想计算每个关键字的所有最新文档,并计算位置的总和。我不能让我的头围绕这个试图做它与地图/减少只

我的用户案例是:

  • 查找每个profile.user、每个关键字的最新文档
  • 计算唯一配置文件的数量。每个关键字的名称
  • 按关键字汇总最近文档的位置
  • 我能使其工作的唯一方法是使用以下列表功能:

    function(head, req) {
      var row;
      var counts = {};
      while (row = getRow()) {
        var v = row.value;
        var k = v.keyword;
    
        if (v.position) {
          if (!counts[k])
            counts[k] = { 
              position : 0,
              count : 0
            }
          counts[k].position += v.position;
          counts[k].count++;
        }
      }
    
      return JSON.stringify(counts);
    }
    
    有人能想出一个更好的方法来做到这一点,只使用map/reduce吗


    谢谢

    有些部分的含义仍然有点模糊(例如,“位置”是什么?)

    但从纯形式的角度来看,似乎您的列表在
    关键字上创建了索引,而您的地图在
    [配置文件、关键字、时间戳]
    上创建了索引


    如果您确实需要不同的索引,那么您需要几个映射,每个索引一个。唯一的例外是,当您在
    [a,b,c]
    上已经有了地图时,您可以更改“组级别”并获得另外两个索引:
    [a,b]
    [a]

    详细信息并不特别重要。要点和你说的一模一样:我需要在配置文件、关键字、时间戳上建立索引,以首先获得每个配置文件、每个关键字的最新“位置”。然后,这个结果我需要在关键字上建立索引来计算和求和位置。在一个视图中有两种不同的排序--确定这是map/reduce无法完成的吗?不过,couchdb list函数似乎使我能够做到这一点。但是当配置文件的nr增加时,我会遇到迭代视图的所有结果的问题……问题是您在列表中创建的索引不会被存储。因此,性能将非常不理想。如果需要良好的性能,请为每个索引创建一个映射。如果您真的需要在同一个资源中混合这些索引,那么您应该在外部使用NodeJS。
    function(head, req) {
      var row;
      var counts = {};
      while (row = getRow()) {
        var v = row.value;
        var k = v.keyword;
    
        if (v.position) {
          if (!counts[k])
            counts[k] = { 
              position : 0,
              count : 0
            }
          counts[k].position += v.position;
          counts[k].count++;
        }
      }
    
      return JSON.stringify(counts);
    }