用CouchDB连接/求和
使用,我目前有一个代表想法的文档,您可以对这个想法进行评分。每个想法都是一个文件,每个评级都是一个不同的文件。我这样做是为了在人们对一个想法进行评级时避免并发访问问题 我的文档看起来是这样的(我简化了它们): 一个想法:用CouchDB连接/求和,couchdb,nosql,document-oriented-db,Couchdb,Nosql,Document Oriented Db,使用,我目前有一个代表想法的文档,您可以对这个想法进行评分。每个想法都是一个文件,每个评级都是一个不同的文件。我这样做是为了在人们对一个想法进行评级时避免并发访问问题 我的文档看起来是这样的(我简化了它们): 一个想法: { "_id": "idea1", "title": "A great idea" } 评级: { "_id": "rating1", "rating": 1, "author": "author1" } { "_id": "rating2", "rating
{
"_id": "idea1",
"title": "A great idea"
}
评级:
{
"_id": "rating1",
"rating": 1,
"author": "author1"
}
{
"_id": "rating2",
"rating": 1,
"author": "author2"
}
我目前使用reduce函数返回想法id和他/她的评分(评分的简单总和):
地图:
减少:
function(keys, values, rereduce) {
return sum(values);
}
function(keys, values, rereduce) {
var i, l, ret = {idea:null, rating:0};
for (i = 0, l = values.length; i < l; ++i) {
switch (values[i][0]) {
case "idea": ret.idea = values[i][1]; break;
case "rating": ret.rating += values[i][1]; break;
}
}
return ret;
}
我的问题是:我如何“加入”这个“创意”文档,并使用代表创意评级的reduce结果?首先,请不要创建自己的uuid,让CouchDB为您创建一个uuid。好多了,我向你保证:) 简单的回答是,除了一个额外的查询之外,您无法获取idea文档。尽管查询速度很快,因为您的投票文档中有_id 如果您想返回所有投票的完整文档,以便获取评论或其他内容,您完全可以这样做。只需使用?include_docs=true映射运行视图查询:
function(doc) {
switch (doc.type) {
case "idea": emit(doc._id, ["idea", doc]); break;
case "rating": emit(doc.idea_id, ["rating", doc.rating]); break;
}
}
减少:
function(keys, values, rereduce) {
return sum(values);
}
function(keys, values, rereduce) {
var i, l, ret = {idea:null, rating:0};
for (i = 0, l = values.length; i < l; ++i) {
switch (values[i][0]) {
case "idea": ret.idea = values[i][1]; break;
case "rating": ret.rating += values[i][1]; break;
}
}
return ret;
}
函数(键、值、返回值){
var i,l,ret={idea:null,rating:0};
对于(i=0,l=values.length;i
另一个选择是这样做