【问题标题】:Forming a view/reduce for couchdb为 couchdb 形成视图/缩减
【发布时间】:2013-07-16 13:35:05
【问题描述】:

我对 couchDB 以及视图和缩减的概念还很陌生,我找不到任何可以帮助我以我想要的格式获取数据的东西。

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

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

{
    "_id" : "2012-10-29",
    "scores" : [
        {
             "bob": 3,
             "dole": 6
        }
    ]
}

我想要一个返回如下内容的视图/缩减:

"bob" : {
    "2012-10-27": 3,
    "2012-10-28": 3,
    ...
},
"dole": {
    "2012-10-27": 5,
    "2012-10-28": 6,
    ...
}

如果我的源数据无法做到这一点,我可以重新组织它,但这会很困难。

非常感谢任何帮助。我还想知道有什么好的资源可以解释视图和减少的最佳做法。

【问题讨论】:

  • 您的示例中的所有数据都在一个文档中吗?
  • 不,它们是单独的文件。我更新了问题以在条目之间添加物理分隔以帮助澄清这一点。
  • 仍然不知道文档从哪里开始或结束以及视图行从哪里开始或结束。某些键是否应该是文档 ID?还是查看密钥?
  • 第一个代码块是两个文档。第二个代码块是我希望从行中的视图中得到的示例。

标签: couchdb


【解决方案1】:

除非所有日期都是已知的,并且您可以在 reduce 函数中对其进行硬编码,否则我认为使用 map/reduce 函数执行您需要的操作有点困难。

如果可以输出如下内容:

{
  "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]);
  }
};

请注意,我认为原始文档的结构可以优化。您有一个分数数组,但其中只有 1 个元素,该元素是一个具有多个名称/玩家键的对象)。这可以改为:

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

这样会更容易操作。

希望这会有所帮助。

【讨论】:

  • 这是我最终想出的,但它让我想到了一个问题。我知道我可以用 startkey=["bob"]&endkey=["bob",{}] 查询这个,但如果我想同时获得 bobdole 有没有办法在一个查询中做到这一点?
  • 是的,您可以使用startkey=["bob"]&endkey=["dole"]startkey=["AAA"]&endkey=["zzz"]
  • 这也将得到介于两者之间的所有内容,对吗?有没有办法只得到这两个键?
  • 您可以尝试使用keys=[key1,key2],但我不确定* 是否可以在这里使用组合键,例如keys=[["bob", "*"],["dole", "*"]].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2020-05-31
  • 2011-02-19
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多