2011-03-30 46 views
1
特定的MapReduce

我有3种类型的文件在我的数据库:不知道如何创建CouchDB中

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

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

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

(我不能改变布局... ;-()

类型1定义了一个开始时间戳,就像开始事件类型1通过类型2文档连接到几个类型3文档

我想获得最新的类型3(最高时间戳)和相应的类型1

如何组织我的地图/缩小?

+0

我在考虑数据结构的时候非常困难,能否包含一些更真实的测试数据?我真的很想帮忙,但我真的不太明白要做多好。 – 2011-03-30 14:11:18

回答

0

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

+0

很好的答案。是不是可以用CouchDB做到这一点? 我知道这不是最优的,但我想学习;-) – philipp 2011-03-31 11:35:44

+0

嗯,今天我有一个更好的一天,所以我会做我最好的CouchDB拍摄在一个单独的答案。为了学习的目的,这太棒了!但是,当我说“我无法更改数据结构”时,这是一个红旗,提醒我考虑架构和SQL数据库。 – JasonSmith 2011-04-01 04:14:19

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]及其相应PARAM在value[1],然后用partof-by-param?key="<what you got in previous query>"再次查询。如果您需要连同时间戳和参数一起获取完整文档,则您必须使用includedocs=true并提供正确的_doc值。

相关问题