我正在尝试计算couchbase存储桶中与产品相关的“评论”数量。对于“完整”的数据集来说,这一部分很容易。这只是一个简单的map / reduce。当我想将其限制为仅在日期范围内发生更改的产品时,事情就变得棘手了。我可以在CB中以两个不同的视图来做这件事。一个获取产品Id,dateCreated在我的范围内,然后我将这些Id传递给另一个,它计算我的统计数据。然而,这种方法的性能很糟糕。第二个查询的键不一定是连续的,所以我不能对它们进行开始/结束操作;我使用的是版本4.x .net的CouchBase2.2客户机。
我对任何选项都持开放态度;例如,Super-a do-all- in -one-call View,或者,如果客户端有一些能力来批量获取view中的非连续键(我在这个主题上找不到任何东西),也可以遵循2视图方法。
以下是我的简化示例模式:
{
"comment": {
"key": "key1",
"title": "yay",
"productId": "product1",
"dateCreated": "2016,11,30"
},
"comment": {
"key": "key2",
"title": "booo",
"productId": "product1",
"dateCreated": "2016,12,30"
}
}发布于 2016-04-29 05:43:49
不确定这是否是您想要的(也不确定如何将其转换为C#),但是假设您有两个文档,is分别为comment::1和comment::2,并且每个文档都采用这种格式。
{
"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);
}
}Reduce
_count然后,您可以使用View Query API对您的文档执行startKey和endKey范围。
终点
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"}
]
}https://stackoverflow.com/questions/36853319
复制相似问题