1

我的数据库中有 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?

4

2 回答 2

0

正如用户 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值。

于 2011-04-13T19:25:42.800 回答
0

简单的。对于高度相关的数据,请使用关系数据库。

于 2011-03-31T04:03:02.350 回答