不知道如何在CouchDB中创建特定的MapReduce

时间:2011-03-30 13:19:13

标签: map couchdb mapreduce reduce

我的数据库中有3种类型的文档:

{
param: "a",
timestamp: "t"
} (Type 1)

{
param: "b",
partof: "a"
} (Type 2)

{
param: "b",
timestamp: "x"
} (Type 3)

(我无法改变布局...... ;-()

类型1定义了开始时间戳,它类似于开始事件。类型1通过类型2文档连接到多个类型3文档。

我想获得最新的Type 3(最高时间戳)和相应的type 1文档。

我如何组织Map / Reduce?

2 个答案:

答案 0 :(得分:0)

易。对于高度关系数据,请使用关系数据库。

答案 1 :(得分:0)

正如用户jhs在我之前所述,您的数据是关系型的,如果您无法更改,那么您可能希望重新考虑使用CouchDB

通过 relational ,我们的意思是数据中的每个“类型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值。