不知道如何在 CouchDB 中创建特定的 MapReduce
Posted
技术标签:
【中文标题】不知道如何在 CouchDB 中创建特定的 MapReduce【英文标题】:No Idea how to create a specific MapReduce in CouchDB 【发布时间】:2011-07-26 02:28:02 【问题描述】:我的数据库中有 3 种类型的文档:
param: "a",
timestamp: "t"
(Type 1)
param: "b",
partof: "a"
(Type 2)
param: "b",
timestamp: "x"
(Type 3)
(我无法更改布局...;-( )
类型 1 定义了一个开始时间戳,它类似于开始事件。 Type 1 通过 Type 2 文档连接到多个 Type 3 文档。
我想获取最新的 Type 3(最高时间戳)和对应的 type 1 文档。
如何组织我的 Map/Reduce?
【问题讨论】:
我很难围绕您的数据结构思考问题,您能否包含一些更真实的测试数据?我真的很想帮忙,但我的理解还不够好。 【参考方案1】:简单。对于高度相关的数据,请使用关系数据库。
【讨论】:
不错的答案。用 CouchDB 不能做到这一点吗?我知道这不是最佳的,但我想学习 ;-) 好吧,我今天过得更好,所以我将在单独的答案中制作我最好的 CouchDB 镜头。用于学习目的,太好了!但是,当我说“我无法更改数据结构”时,这是一个危险信号,提醒我考虑架构和 SQL 数据库。【参考方案2】:正如用户 jhs 在我之前所说,您的数据是关系数据,如果您无法更改它,那么您可能需要重新考虑使用 CouchDB。
关系是指数据中的每个“类型 1”或“类型 3”文档仅“了解”其自身,而“类型 2”文档包含有关文档之间关系的知识的其他类型。使用 CouchDB,您只能按文档本身中的字段进行索引,并且在使用 includedocs=true
查询时更深一层。因此,您要求的内容无法通过单个 CouchDB 查询来实现,因为某些所需数据与请求的文档相距两层。
这里是一个两个查询的解决方案:
"views":
"param-by-timestamp":
"map": "function(doc) if (doc.timestamp) emit(doc.timestamp, [doc.timestamp, doc.param]); ",
"reduce": "function(keys, values) return values.reduce(function(p, c) return c[0] > p[0] ? c : p ) "
,
"partof-by-param":
"map": "function(doc) if (doc.partof) emit(doc.param, doc.partof); "
你先用param-by-timestamp?reduce=true
查询得到value[0]
的最新时间戳,value[1]
对应的参数,然后用partof-by-param?key="<what you got in previous query>"
再次查询。如果您需要获取完整文档以及时间戳和参数,则必须使用 includedocs=true
并提供正确的 _doc
值。
【讨论】:
以上是关于不知道如何在 CouchDB 中创建特定的 MapReduce的主要内容,如果未能解决你的问题,请参考以下文章
python 使用python在couchdb中创建一个复制链接