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

标签 list couchdb

我需要您有关 CouchDB reduce 函数的帮助。 我有一些文档,例如:

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

是否有可能得到我所期望的或者我需要使用其他方式?

最佳答案

您不应该在reduce函数中执行此操作。作为couchdb wiki解释:-

If you are building a composite return structure in your reduce, or only transforming the values field, rather than summarizing it, you might be misusing this feature.

您可以采取两种方法

  1. 在应用程序层转换结果。

  2. 使用list function

列表功能很简单。我将尝试在这里解释它们:

类似 View 的列表保存在设计文档中的关键列表下。就像这样:

"lists":{

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

}

要调用列表函数,您可以使用这样的 url

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 函数感兴趣。它包含 View 的结果。所以我们可以这样查询

row.key 用于键

row.value 表示值

您现在要做的就是按照您想要的方式构造 json,然后发送它。

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

我希望这会有所帮助。

关于list - 如何返回我在reduce函数中创建的JSON对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428855/

相关文章:

c# - 如何在 Visual Studio C# 中正确公开 List<object> 属性?

python - 也可以通过网络同步的小型 "embeddable"数据库?

javascript - 使用 jQuery UI Accordion 显示 couchDB 数据库搜索结果的问题

mapreduce - Couchdb:关系数据库功能

Python 遍历列表中的滑动窗口对?

android - add 方法如何在 kotlin 中对 List<E> type val 起作用

java - 如何在链表中的另一个元素之前插入 和 元素

javascript - Ember 得不到某些属性

couchdb - 计算某种类型的文档(之前针对用户进行过滤)

python - 访问元组列表中的 y 坐标