Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 使用CouchDB自定义ID的最新或第一个结果_Database Design_Statistics_Couchdb - Fatal编程技术网

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
。插入结果时,将生成
时间戳
。一个装置可以进行多次测试

我试图构建的视图如下所示:

  • 第一次测试单元时检索所有数据
  • 检索最近一次单元测试的所有数据
  • 检索一个测量id的所有测量值,但仅检索最旧的结果。如果任何一个装置已经测试了不止一次,则只应包括第一次测试的测量结果
  • 检索一个
    测量\u id
    的所有测量值,但仅检索最新结果(与最旧结果的规则相同)
  • 目标是减少
    数据
    字段,以计算统计数据,如
    平均值
    最小值
    最大值
    标准偏差
    ,能够在第一次/最晚测试单元时分离统计数据是非常有价值的

    我一直在尝试使用复杂的键、非常高级的reduce和许多其他方法,但我似乎无法分离出最新/最新的结果

    这个应用程序还远未投入生产,所以任何解决方案都是受欢迎的(我想,甚至是切换数据库系统)。我是否应该以任何其他方式构造数据?这可能吗?从长远来看,我将拥有大量的数据,因此我可以增量计算统计数据是非常重要的

    看起来和我的差不多,但从来没有任何答案,我已经走到了他走的那么远

    更新#1

    对于案例1和案例2,我可能只需映射
    [serial\u nr,timestamp]
    ,然后关闭reduce\u limit以允许我只返回最近的条目。但我不知道从长远来看这会如何影响性能

    对于3号和4号来说,难度更大。因为我需要按
    measurement\u id
    计算分组,所以它需要是键数组中的第一个元素。那又怎么样

    (为了使事情更简单,我现在假设
    测量结果
    文档也有
    序列号

    GET
    with
    group\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 } ] }