如何返回我在reduce函数中创建的JSON对象

时间:2014-06-26 11:06:35

标签: list couchdb

我需要你关于CouchDB减少功能的帮助。 我有一些文档,如:

{'about':'1', 'foo':'a1','bar':'qwe'}
{'about':'1', 'foo':'a1','bar':'rty'}
{'about':'1', 'foo':'a2','bar':'uio'}
{'about':'1', 'foo':'a1','bar':'iop'}
{'about':'2', 'foo':'b1','bar':'qsd'}
{'about':'2', 'foo':'b1','bar':'fgh'}
{'about':'3', 'foo':'c1','bar':'wxc'}
{'about':'3', 'foo':'c2','bar':'vbn'}

正如您所看到的,它们都具有相同的键,只是值是不同的。 我的意思是使用Map / Reduce,我的回报期望是:

'rows':[ 'keys':'1','value':{'1':{'foo':'a1', 'at':'rty'},
                             '2':{'foo':'a2', 'at':'uio'},
                             '3':{'foo':'a1', 'at':'iop'}}
         'keys':'1','value':{'foo':'a1', 'bar','rty'}
          ...
         'keys':'3','value':{'foo':'c2', 'bar',vbn'}
       ]

这是我的Map功能的结果:

'rows':[ 'keys':'1','value':{'foo':'a1', 'bar','qwe'}
         'keys':'1','value':{'foo':'a1', 'bar','rty'}
          ...
         'keys':'3','value':{'foo':'c2', 'bar',vbn'}
       ]

但我的Reduce功能不起作用:

function(keys,values,rereduce){
  var res= {};
  var lastCheck = values[0];
  for(i=0; i<values.length;++i)
  {
    value = values[i];
    if (lastCheck.foo != value.foo)
    {
      res.append({'change':[i:lastCheck]});
    }
    lastCheck = value;
   }
   return res;
 }

是否有可能拥有我期望的或我需要以其他方式使用?

2 个答案:

答案 0 :(得分:2)

您不应该在reduce函数中执行此操作。正如couchdb wiki所解释的那样: -

  

如果要在reduce中构建复合返回结构,或仅转换值字段,而不是对其进行汇总,则可能会滥用此功能。

您可以采用两种方法

  1. 在应用层转换结果。

  2. 使用list function

  3. 列表功能很简单。我会在这里解释一下:

    视图列表保存在密钥列表下的设计文档中。像这样:

    "lists":{
    
      "formatResults" : "function(head,req) {....}" 
    
    }
    

    要调用列表功能,请使用此类网址

    http://localhost:5984/your-database/_design/your-designdoc/_list/your-list-function/your-view-name

    以下是列表功能的示例

    function(head, req) {
      var row = getRow();
      if (!row){
        return 'no ingredients'
       }
    
      var jsonOb = {};
    
      while(row=getRow()){
         //construct the json object here
      }
         return {"body":jsonOb,"headers":{"Content-Type" : "application/json"}};
    }
    

    getRow功能对我们很感兴趣。它包含视图的结果。所以我们可以像

    一样查询它

    row.key代码

    价值

    row.value

    现在你要做的就是按照你想要的方式构建json然后send

    顺便说一句,您可以使用log 调试你的功能。

    我希望这会有所帮助。

答案 1 :(得分:0)

显然现在你需要使用

provides('json', function() { ... }); 

如: Simplify Couchdb JSON response