Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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
Javascript CouchDB中哈希数组的Map/Reduce_Javascript_Couchdb_Mapreduce - Fatal编程技术网

Javascript CouchDB中哈希数组的Map/Reduce

Javascript CouchDB中哈希数组的Map/Reduce,javascript,couchdb,mapreduce,Javascript,Couchdb,Mapreduce,我正在寻找一个map/reduce函数来计算设计文档中的状态。 下面您可以看到我当前数据库中的示例文档 { "_id": "0238f1414f2f95a47266ca43709a6591", "_rev": "22-24a741981b4de71f33cc70c7e5744442", "status": "retrieved image urls", "term": "Lucas Winter", "urls": [ { "st

我正在寻找一个map/reduce函数来计算设计文档中的状态。 下面您可以看到我当前数据库中的示例文档

{
   "_id": "0238f1414f2f95a47266ca43709a6591",
   "_rev": "22-24a741981b4de71f33cc70c7e5744442",
   "status": "retrieved image urls",
   "term": "Lucas Winter",
   "urls": [
       {
           "status": "retrieved",
            "url": "http://...."
       },
       {
           "status": "retrieved",
            "url": "http://..."
       }
   ],
   "search_depth": 1,
   "possible_labels": {
       "gender": "male"
    },
    "couchrest-type": "SearchTerm"
}
我想去掉
status
键,而是根据URL的状态来计算它。 我的当前状态视图如下所示:

function(doc) {
    if (doc['status']) {
       emit(doc['status'], null);
    }
}
我试过一些方法,但实际上什么都不管用。现在,我的
映射函数
如下所示:

function(doc) {
    if(doc.urls){
        emit(doc._id, doc.urls)
    }
}
我的
减少功能

function(key, value, rereduce){ 
    var reduced_status = "retrieved"
    for(var url in value){
        if(url.status=="new"){
            reduced_status = "new";
        }
    }
    return reduced_status;
}
结果是我到处都被检索到,这绝对是不对的

我试图缩小问题的范围,似乎
value
不是数组,当我使用以下
Reduce函数时,
length 1无处不在,这是不可能的,因为我的数据库中有12个文档,每个文档包含20到200个URL

function(key, value, rereduce){ 
   return value.length;
}


我做错了什么?(我知道我想让你为我写代码,我感到内疚,但现在我在从数据库中获取数据后,用ruby计算状态。如果已经从数据库中获取了正确的数据,那就太好了)
doc.url
似乎是一个
对象
数组,其中包含一个
状态
属性和一个
url
属性。所以你的Reduce函数应该是

function(key, value, rereduce){ 
    var reduced_status = "retrieved";
    for(var i=0; i<value.length; i++) {
        if(value[i].status=="new"){
            reduced_status = "new";
        }
    }
    return reduced_status;
}
函数(键、值、返回){
var reduced_status=“已检索”;

对于(var i=0;i感谢Alsciende将我推向正确的解决方案,结果证明我真的不理解reduce函数。我根本不需要reduce函数

这是我的
映射函数
,它为我解决了这个问题

function(doc) {
if(doc.urls){
  var reduced_status = "retrieved";
  for(var i=0; i<doc.urls.length; i++) {
    if(doc.urls[i].status=="new"){
        reduced_status = "new";
        break;
    }
  }
  emit(reduced_status, null);
  }
}
功能(doc){
if(doc.url){
var reduced_status=“已检索”;

对于(var i=0;i来说,reduce函数的变量
value
是一个由map函数发出的值数组。在您的例子中,
value
是一个由“url”组成的数组-数组。在futon中运行map reduce时,它会设置
group=true
,以便对map函数发出的每个键分别运行map reduce。在您的情况下,这些键是文档
\u id
。也就是说,reduce函数的
是一个数组,其元素都是属于某个文档id的url数组。由于文档ID是唯一的,因此reduce函数的
是一个包含一个元素的数组,该元素是相应文档的url数组。这就是为什么reduce函数的
值。length
始终为1

但情况可能会变得更糟:如果您最终进入一个rereduce循环,则reduce函数的
是一个值数组,由先前调用reduce函数返回。在您的情况下,您可以使用
调用reduce函数,看起来像
[“已检索”、“新建”、“已检索”]
,这不会导致正确的结果

通常,reduce函数用于聚合map函数发出的数据,例如计算行数或求和值,这在您的情况下是不必要的。您可以在couchdb中阅读有关map reduce的更多信息:


唯一的问题是,value.length始终是1-请参阅我原始问题的下三分之一-我不知道为什么,因为doc.url应该包含20到200个散列。好的,但您的Reduce函数仍然是非常错误的。例如..in的工作方式与您认为的不一样。JSON.stringify(value)返回什么?(JSON是Firefox 3.5+中的本机窗口对象)