我试图计算评论的数量'与沙发基地桶中的产品有关。那部分对于一个完整的"数据集。它只是一个简单的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"
}
}
答案 0 :(得分:0)
不确定这是否是您想要的(也不确定如何将其转换为C#),但是说您有两个包含ID comment::1
和comment::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在文档上执行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"}
]
}