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