Database design 使用CouchDB自定义ID的最新或第一个结果
我已经试着弄明白这一点有一段时间了,读了很多这样的问题,费力地翻阅了文档,但都没有用。我希望这里有人能给我指出正确的方向 考虑以下文件:Database design 使用CouchDB自定义ID的最新或第一个结果,database-design,statistics,couchdb,Database Design,Statistics,Couchdb,我已经试着弄明白这一点有一段时间了,读了很多这样的问题,费力地翻阅了文档,但都没有用。我希望这里有人能给我指出正确的方向 考虑以下文件: { "_id": "045bdeb40176b33cf07b21cd1fb3949e", "type": "test_result", "customer_id": "customer", "product_id": "product1", "type_id": "type", "version_id": "1.
{
"_id": "045bdeb40176b33cf07b21cd1fb3949e",
"type": "test_result",
"customer_id": "customer",
"product_id": "product1",
"type_id": "type",
"version_id": "1.0.0",
"timestamp": 1381505909000,
"test_result": "passed",
"serial_nr": "NEP000001"
}
{
"_id": "045bdeb40176b33cf07b21cd1fb3c434",
"type": "measurement_result",
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"measurement_id": "customer:product1:type:1.0.0:0",
"timestamp": 1381505909000,
"data": 2.5
}
该应用程序包含以不同方式测量的单位数据。每次对装置进行测试时,都会插入一份测试结果
文档。每个单元都有一个唯一的序列号
。一个measurement\u结果
文档用于在一个装置上进行的每次测量(通常每个装置约50次测量)。该单位的每个测量值都有一个唯一的测量值\u id
。插入结果时,将生成时间戳
。一个装置可以进行多次测试
我试图构建的视图如下所示:
测量\u id
的所有测量值,但仅检索最新结果(与最旧结果的规则相同)数据
字段,以计算统计数据,如平均值
、最小值
、最大值
和标准偏差
,能够在第一次/最晚测试单元时分离统计数据是非常有价值的
我一直在尝试使用复杂的键、非常高级的reduce和许多其他方法,但我似乎无法分离出最新/最新的结果
这个应用程序还远未投入生产,所以任何解决方案都是受欢迎的(我想,甚至是切换数据库系统)。我是否应该以任何其他方式构造数据?这可能吗?从长远来看,我将拥有大量的数据,因此我可以增量计算统计数据是非常重要的
看起来和我的差不多,但从来没有任何答案,我已经走到了他走的那么远
更新#1
对于案例1和案例2,我可能只需映射[serial\u nr,timestamp]
,然后关闭reduce\u limit以允许我只返回最近的条目。但我不知道从长远来看这会如何影响性能
对于3号和4号来说,难度更大。因为我需要按measurement\u id
计算分组,所以它需要是键数组中的第一个元素。那又怎么样
(为了使事情更简单,我现在假设测量结果
文档也有序列号
)
GET
withgroup\u level=1
是我在这里的唯一选择,因为否则我将获得每个测量id的单独结果-但我仍然无法仅过滤出最新或最旧的结果,这只能获得所有结果。现在我也许可以编写一个reduce函数,以某种方式检查重复的serial\u nr
,只返回最新/最旧的,但我不知道如何返回
希望这能澄清一点问题。我认为您可能犯的一个错误是试图以RDBMS的方式组织数据。如果你的测量值真的只有50左右,那么它们很容易存在于同一个文档中。你只需要关心的是,如果条目的数量没有上限……我在同一份文件中有数千条,我不推荐 使用couchdb,您只需创建一个函数,该函数可以按顺序向数组中添加值……下面是一个快速参考 基本上,如果文档不存在,更新处理程序必须创建文档,并向数组中添加条目。 使用您的示例,您可以将-测量和-测试结果作为简单的自然关键点。 您的新文档应如下所示:
{
"_id": "NEP000001-measurements",
"type": "measurement_result",
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"serial_nr": "NEP000001",
"measurements": [
{
"measurement_id": "customer:product1:type:1.0.0:0",
"timestamp": 1381505909000,
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"data": 2.5
},
{
"measurement_id": "customer1:product2:type:1.0.0:0",
"timestamp": 1381505909005,
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"data": 2.7
}
]
}
Couchdb视图允许您将视图中的结果与数据库中的数据进行分割
无论如何,在此之后,您可以看到类似以下内容的视图函数:
1) 首先
_查看/首次测量
地图:
功能(doc){
如果(doc.type==“测量结果”){
var first=文件测量[0];
发出([first.measurement\u id,doc.serial\u nr,first.timestamp],first.data)
}
}
减少:
_统计数据
(二)
_查看/最新
地图:
功能(doc){
如果(doc.type==“测量结果”){
var last=文件测量值[文件测量值长度-1];
发出([last.measurement\u id,doc.serial\u nr,last.timestamp],last.data)
}
}
减少:
_统计数据
//我对测量id和文档id之间的区别有点困惑,什么是唯一的,所以我可能还不能完全回答这个问题,但听起来您可以使用startkey和endkey范围,并结合使用descending=false…来获得所需的内容..还可以使用include_doc=true来检索发出值的文档..(或数据库中的任何其他文档:-))…无论如何,希望这能有所帮助我认为您可能犯的一个错误是试图用RDBMS的方式组织数据。如果你的测量值真的只有50左右,那么它们很容易存在于同一个文档中。你只需要关心的是,如果条目的数量没有上限……我在同一份文件中有数千条,我不推荐 使用couchdb,您只需创建一个函数,该函数可以按顺序向数组中添加值……下面是一个快速参考 基本上,如果文档不存在,更新处理程序必须创建文档,并向数组中添加条目。 使用您的示例,您可以将-测量和-测试结果作为简单的自然关键点。 您的新文档应如下所示:
{
"_id": "NEP000001-measurements",
"type": "measurement_result",
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"serial_nr": "NEP000001",
"measurements": [
{
"measurement_id": "customer:product1:type:1.0.0:0",
"timestamp": 1381505909000,
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"data": 2.5
},
{
"measurement_id": "customer1:product2:type:1.0.0:0",
"timestamp": 1381505909005,
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"data": 2.7
}
]
}