不知道如何在CouchDB中创建特定的MapReduce
我的数据库中有3种类型的文档:不知道如何在CouchDB中创建特定的MapReduce,map,couchdb,mapreduce,reduce,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文档 我想获得最新的Type3(最高时间戳)和相应的Type1文档 如何组织我的Map/Reduce?简单。对于高度相
{
param: "a",
timestamp: "t"
} (Type 1)
{
param: "b",
partof: "a"
} (Type 2)
{
param: "b",
timestamp: "x"
} (Type 3)
(我不能改变布局…;-()
类型1定义了一个开始时间戳,就像开始事件一样。类型1通过类型2文档连接到多个类型3文档
我想获得最新的Type3(最高时间戳)和相应的Type1文档
如何组织我的Map/Reduce?简单。对于高度相关的数据,请使用关系数据库。正如用户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=“”
。如果您需要获取完整文档以及时间戳和参数,那么您必须使用includedocs=true
,并提供正确的\u doc
值。我很难对您的数据结构进行思考,您能提供一些更真实的测试数据吗?我非常希望我想帮忙,但我真的理解得不够好。回答得好。难道用CouchDB不可能做到这一点吗?我知道这不是最优的,但我想学习;-)好吧,我今天过得更好,所以我将在单独的答案中拍摄我最好的CouchDB。为了学习,那太好了!但是,当我说“我不能改变数据结构”时,这是一个红旗提醒我要考虑一个模式和SQL数据库。