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