返回值作为地图上的键减少

时间:2013-02-01 18:31:20

标签: javascript mapreduce couchdb

目前我对couchdb的看法总是返回如下内容:

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

我想知道是否有办法归还这样的东西:

{
  "somekey":"somevalue"
}

我需要直接访问“somekey”而无需在整个数组中搜索带有“somekey”值的键。

由于

3 个答案:

答案 0 :(得分: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 :(得分: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/

答案 2 :(得分:0)

如果您不喜欢Couch查询的格式或数据,可以使用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 ']';
}