1

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

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

我想知道是否有任何方法可以返回这样的东西:

{
  "somekey":"somevalue"
}

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

谢谢

4

3 回答 3

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;
}
于 2013-02-01T23:02:00.007 回答
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/

于 2013-02-01T18:50:42.267 回答
0

如果您不喜欢 Couch 查询的格式或数据,您可以使用list 功能随意重新格式化。像这样的东西应该适合你:

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 ']';
}
于 2013-02-02T09:30:57.417 回答