2013-02-01 38 views
1

目前我对CouchDB视图总是返回是这样的:返回值作为在地图上的关键减少

{ 
    "key":"somekey", 
    "value":"somevalue" 
} 

我不知道是否有任何的方式来回报这样的事情:

{ 
    "somekey":"somevalue" 
} 

我需要直接访问“somekey”,而不必搜索整个数组中的“somekey”值的密钥。

感谢

+0

''key'不仅可以是字符串,你可能会遇到这些情况的一些问题。 – Kxepal

回答

2

当使用视图,存在通过CouchDB的提供返回的文档集合,只能作为键/值,你见过没有直接的方法。

你需要在客户端的数据映射到一个键索引,或者通过直接键从视图中请求文件:

/sample/_design/docs/_view/by_somekey?key="somekey" 

如果你正在寻找一个快速的地图选项在JavaScript(避免呼吁每个迭代函数),你可以只使用过程中的这个简单的逻辑:

// docs are the documents returned from the view 
var map={}; 
for(var i=0,len=docs.length;i<len;i++) { 
    map[docs[i].key] = docs[i].value; 
} 
1

你可以用underscoreJS(http://underscorejs.org/#reduce)做到这一点。

var map = { 
    "key":"somekey", 
    "value":"somevalue" 
}; 

var result = _.reduce(map, function(key, value){ 
    var result = {}; 
    result[key] = value 
    return result; 
}); 

alert(result.somekey); 

http://jsfiddle.net/BcYtw/1/

+0

原始文档将位于数组中,而不是单个对象。你的代码不适用于Bnif的情况。 – WiredPrairie

+0

第一个参数记录为列表。正如你在_.map例子中看到的那样,它可能是一个数组或对象。 –

+0

你的代码不适用于数组。 – WiredPrairie

0

如果你不喜欢的沙发查询的格式或数据,你可以在你将它重新格式化list function。像这样的东西应该适合你:

function(head, req){ 
    send('['); 
    row = getRow(); 
    if (row){ 
    // here you make your own JS structure to be returned, 
    // serialize it with toJSON() and send to client with send() 

    // First row: 
    var new_row = {}; 
    new_row[row.key] = row.value; 
    send(toJSON(new_row)); 

    while(row = getRow()){ 
     // Next rows: 
     send(','); 
     var new_row = {}; 
     new_row[row.key] = row.value; 
     send(toJSON(new_row)); 
    } 
    } 
    return ']'; 
}