Couchbase View等同于doc.productId所在的doc中的select count(doc.id)(从doc中选择productId,其中doc.lastupdated介于x和y之间)

时间:2016-04-26 00:20:54

标签: c# performance couchbase couchbase-view

我试图计算评论的数量'与沙发基地桶中的产品有关。那部分对于一个完整的"数据集。它只是一个简单的map / reduce。当我想将它限制在只有在日期范围内有变化的产品时,事情变得棘手。我可以将此作为CB中的两个不同视图。获取产品ID的地方,其中dateCreated属于我的范围,然后是我将这些ID传递给我并且计算我的统计数据。然而,这种方法的表现非常糟糕。第二个查询的关键字不一定是连续的,因此我无法对它们进行开始/结束;我正在使用.net 2.2客户端版本4.x couchbase。

我对任何选择持开放态度;即,如果客户端具有一定的容量来对视图中的非连续密钥进行批量处理,那么可以使用超级强大的一体化呼叫视图,或遵循2视图方法(我可以&#39 ;找到关于这个主题的任何内容。)

这是我的简化示例架构:

{
    "comment": {
        "key": "key1",
        "title": "yay",
        "productId": "product1",
        "dateCreated": "2016,11,30"
    },
    "comment": {
        "key": "key2",
        "title": "booo",
        "productId": "product1",
        "dateCreated": "2016,12,30"
    }
}

1 个答案:

答案 0 :(得分:0)

不确定这是否是您想要的(也不确定如何将其转换为C#),但是说您有两个包含ID comment::1comment::2的文档以及每个文档的Couchbase文档这种格式。

{
   "key": "key2",
   "title": "booo",
   "productId": "product1",
   "dateCreated": "2016,12,30"
}

您可以定义视图(让我们称之为comments_by_time

<强>地图

function (doc, meta) {
  if (doc.dateCreated) {
    var dateParts = doc.dateCreated.split(",");
    dateParts = dateParts.map(Number);
    emit(dateParts, doc.productId);
  }
}

减少

_count

然后,您可以使用View Query API在文档上执行startKeyendKey范围。

终点

http://<couchbase>:8092/<bucket>/_design/<view>/_view/comments_by_time

获取所有评论的计数

?reduce=true
{"rows":[ {"key":null,"value":2} ] }

在日期之前获取文件

?reduce=false&endkey=[2016,12,1]
{"total_rows":2,"rows":[
{"id":"comment::1","key":[2016,11,30],"value":"product1"}
]
}

日期之间

?reduce=false&startkey=[2016,12,1]&endkey=[2017,1,1]
{"total_rows":2,"rows":[
{"id":"comment::2","key":[2016,12,30],"value":"product1"}
]
}