不知道如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

我不知道如何从字符串、整数或变量中创建一个特定的数组

在 CouchDB 1.0 中创建用户时出错

python 使用python在couchdb中创建一个复制链接

在 scala 中创建的图像看起来不像预期的那样。不知道为啥

在 Couchdb 2.1 集群中创建只读和只写用户

如何在anylogic中创建特定的仓单拣货策略