形成couchdb的视图/简化

形成couchdb的视图/简化,couchdb,Couchdb,我对couchDB和views和reduces的概念相当陌生,我找不到任何东西可以帮助我以我想要的格式获取数据 我的数据-每组都是自己的文档 { "_id": "2012-10-28", "scores" : [ { "bob": 3, "dole": 5 } ] } { "_id" : "2012-10-29", "scores" : [ {

我对couchDB和views和reduces的概念相当陌生,我找不到任何东西可以帮助我以我想要的格式获取数据

我的数据-每组都是自己的文档

{
    "_id": "2012-10-28",
    "scores" : [
        {
             "bob": 3,
             "dole": 5
        }
    ]
}

{
    "_id" : "2012-10-29",
    "scores" : [
        {
             "bob": 3,
             "dole": 6
        }
    ]
}
我想要一个返回如下内容的view/reduce:

"bob" : {
    "2012-10-27": 3,
    "2012-10-28": 3,
    ...
},
"dole": {
    "2012-10-27": 5,
    "2012-10-28": 6,
    ...
}
{
  "key": ["bob", "2012-10-27"],
  "value": {"score": 3}
}
如果我的源数据不能做到这一点,我可以重新组织它,但这将很困难


非常感谢您的帮助。我还想知道任何解释视图和reduce最佳实践的好资源。

除非所有日期都已知,并且您可以在reduce函数中硬编码它们,否则我认为使用map/reduce函数做您需要的事情有点困难

如果可以输出如下内容:

"bob" : {
    "2012-10-27": 3,
    "2012-10-28": 3,
    ...
},
"dole": {
    "2012-10-27": 5,
    "2012-10-28": 6,
    ...
}
{
  "key": ["bob", "2012-10-27"],
  "value": {"score": 3}
}
那么这个
map
功能应该可以工作:

var scoresMapFn = function (doc) {
  var scores = doc.scores[0];
  for (var k in scores) {
    emit([k, doc._id], scores[k]);
  }
};
请注意,我认为可以优化原始文件的结构。您有一个分数数组,但其中只有一个元素,该元素是一个对象,它有多个名称/玩家键)。这可以更改为:

{
    "_id": "2012-10-28",
    "scores": [
      {
        "name": "bob,
        "score": 3
      },
      {
        "name": "dole,
        "score": 5
      }
    ]
}
这样就更容易操纵了


希望这能有所帮助。

您的示例中的所有数据都在一个文档中吗?不,它们是单独的文档。我更新了问题,在条目之间添加了物理分隔,以帮助澄清这一点。仍然不知道文档从何处开始或结束,以及视图行从何处开始或结束。有些密钥应该是文档ID吗?还是查看键?第一个代码块是两个文档。第二个代码块是一个示例,说明了我希望从行中的视图中获取的内容。这是我最终想到的,但是它引出了一个问题。我知道我可以用
startkey=[“bob”]&endkey=[“bob”,{}]
来查询这个问题,但是如果我想同时得到bob和dole,有没有一种方法可以在一个查询中做到这一点呢?是的,你可以做
startkey=[“bob”]&endkey=[“dole”]
或者
startkey=[“AAA”]&endkey=[“zzz”]
。这两者之间的一切都可以做到,对吗?有没有办法只获取这两个键?您可以尝试使用
keys=[key1,key2]
,但我不确定
*
是否可以在这里使用组合键,例如
keys=[[“bob”、“*”]、[“dole”、“*”]