使用CouchDB,我目前有一个代表一个想法的文档,您可以评价这个想法。每个想法都是一个文档,每个评级都是一个不同的文档。我这样做是为了避免在人们评价想法时出现并发访问问题。
我的文档看起来像那样(我简化了它们):
一个想法:
{
"_id": "idea1",
"title": "A great idea"
}
评分:
{
"_id": "rating1",
"rating": 1,
"author": "author1"
}
{
"_id": "rating2",
"rating": 1,
"author": "author2"
}
我目前使用reduce功能将想法ID和他/她的评分(简单的评级总和)返回给我:
地图:
function(doc) {
if (doc.type == "rating")
emit(doc.idea_id, doc.rating);
}
减少
function(keys, values, rereduce) {
return sum(values);
}
我的问题是:我怎样才能“加入”“想法”文档,其中包含代表该想法评级的简化结果?
答案 0 :(得分:7)
地图:
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) {
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;
}
另一种选择是use view collation来做这个伎俩。
答案 1 :(得分:1)
首先,请不要创建自己的_id,让CouchDB为您创建一个uuid。它好多了,我向你保证:)
简短的回答是,除了额外的查询之外,你无法获得任何想法文档。虽然您的投票文档中包含_id,但查询速度非常快。
如果你想要返回所有选票的完整文件,为了获取评论或其他东西,你肯定可以这样做。只需使用?include_docs = true
运行视图查询