我一直在尝试解决这个问题,阅读了很多 SO 问题并浏览了文档,但无济于事。我希望这里有人能指出我正确的方向!
考虑以下文件:
{
"_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
}
该应用程序包含以不同方式测量的单位数据。test_result
每次测试一个单元时插入一个文档。每个单元都有一个独特的serial_nr
. 对一个单元进行的每次测量都会插入一个measurement_result
文档(通常每个单元大约 50 次测量)。该单位的每个测量值都有一个唯一的measurement_id
. 插入结果后,将timestamp
生成 。一个单元可以进行多次测试。
我正在尝试构建的视图如下:
- 检索第一次测试单元的所有数据。
- 检索最近一次测试单元的所有数据。
- 检索 one 的所有测量值
measurement_id
,但仅限于最旧的结果。如果任何一个单元已被多次测试,则仅应包括第一次测试的测量结果。 - 检索 one 的所有测量值
measurement_id
,但仅限于最近的结果(与最旧结果的规则相同)。
目标是减少data
计算统计数据的字段,如average
, min
,max
,standard deviation
并且能够按单元测试的第一次/最后一次分离统计数据是非常有价值的。
我一直在尝试使用复杂的键、非常高级的减少和许多其他方法,但我似乎无法隔离最新/最新的结果。
该应用程序仍远未生产,因此欢迎任何解决方案(我猜甚至切换数据库系统)。我应该以任何其他方式构造数据吗?这甚至可能吗?从长远来看,我将拥有大量数据,因此可以增量计算统计数据非常重要。
这个问题似乎和我的差不多,但从来没有任何答案,我已经和他一样了。
更新#1
对于 #1 和 #2 的情况,我可能只映射[serial_nr, timestamp]
然后关闭 reduce_limit 以允许我只返回最近的条目。我不知道从长远来看这会如何影响性能?
对于#3 和#4,它更难。由于我需要计算分组,measurement_id
它需要是键数组中的第一个元素。但是然后呢?
(为了让事情更简单,我现在假设measurement_result
文件也有serial_nr
)
map:
function(doc) {
if (doc.type == 'measurement_result')
emit([doc.measurement_id, doc.serial_nr, doc.timestamp], doc.data)
}
reduce:
_stats
GET
withgroup_level=1
是我在这里唯一的选择,因为否则我将获得每个measurement_id 的单独结果 - 但我仍然没有设法仅过滤掉最新或最旧的结果,这只会让我得到所有结果。现在我也许可以编写一个 reduce 函数来以某种方式检查重复项serial_nr
并只返回最新/最旧的,但我不知道如何。
希望这能稍微澄清一下这个问题。