如何将以下MySQL模式转换为CouchDB?

时间:2010-08-14 17:58:25

标签: mysql database couchdb

我不确定如何在CouchDB中设计以下问题。

我有一个记录器Web应用程序,可以跟踪仓库中有多少项目。为了简化问题,我们只需要知道当前仓库中的项目总数以及每个项目在发货前在仓库中停留的时间。可以说仓库只有鞋子,但每只鞋都有不同的身份,需要按身份跟踪。

MySQL schema looks like this

    id       name        date-in       data-out
    1        shoe       08/0/2010      null
    2        shoe       07/20/2010     08/01/2010


The output will be
    Number of shoe in warehouse:  1 
    Average time in warehouse:    14 days

由于

2 个答案:

答案 0 :(得分:2)

jhs的答案很棒,但我只是想补充一点:

要使用内置reduce函数进行平均计算(在您的情况下为_stats),您必须使用两个“单独”视图。但是如果你的map-function完全相同,那么CouchDB会检测到它并且不会为第二个视图生成一个全新的索引。这样你就可以有一个map函数提供多个reduce函数。

答案 1 :(得分:1)

如果每个鞋子都是date_indate_out的文档,那么如果date_out为空,则reduce函数将为+1,如果{为{0},则为+ 0(无更改) {1}}不为空。这将为您提供仓库中鞋子的总数。

要计算每只鞋子的平均时间,您就知道仓库中的时间。因此,reduce函数只是累积平均值。由于reduce函数必须是可交换和关联的,因此使用不同的平均算法。最简单的方法是减少到date_out数组,其中[sum, count]是所有鞋子的累计器,sum是计算鞋数的计数器。然后,客户只需将count除以计算最终平均值。

我认为如果你愿意的话,你可以将这两者合并为一个大缩减,也许可以构建一个sum / count种对象。

但是,如果您可以接受此数据的两个不同视图,则可以使用平均值的快捷方式。在地图中,{"shoes in warehouse": 1, "average time in warehouse": [253, 15]}其中emit(null, time)是在仓库中花费的时间。在reduce中,将整个reduce值设置为time(请参阅Built-in reduce functions)。视图输出将是已计算_statssum的对象。