为了在一个键中发出多个数据,你需要在
Complex Keys上读。你很可能最终会发现emit()是一个由类别和标签组成的数组的键。例如…
function(doc) {
for(var i = 0; i < doc.tags.length; i++)
emit([doc.category,doc.tags[i]],doc);
}
现在当你查询?key = [“fun”,“couchdb”]你会得到所有的项目在乐趣类别标记为“couchdb”。或者如果你想要有趣类别中的所有项目,不管他们的标签,那么你可以查询一个范围:?startkey = [“fun”]& endkey = [“fun”,{}]。只要记住,如果你的项目有多个标签,你会在结果中多次获取(因为你每个标签发出一次doc文档)。
要按照评级,日期和标题进行排序的额外步骤,您将向数组中添加两个元素:一个整数,以及排名,日期或标题。记住,你可以为每个map函数emit()多次。地图功能示例…
function(doc) {
for(var i = 0; i < doc.tags.length; i++)
{
emit([doc.category,doc.tags[i],doc.ranking],doc);
emit([doc.category,1,doc.title],2,doc.date],doc);
}
}
现在你的关键结构是:[“category”,“tag”,0 … 2,rank / title / date]
你基本上将所有的排名分为0以下,标题在1以下,日期在2以下。当然,你传输了大量的数据,所以你可以将每个分组放在一个单独的视图中的设计文档,或者只返回文档的_id作为值(emit([…],doc._id);)。
使用“couchdb”标记(升序)获取“fun”类别中的所有内容:
?startkey=["fun","couchdb"]&endkey=["fun","couchdb",{},{}]
使用“couchdb”标记(降序)获取“fun”类别中的所有内容:
?startkey=["fun",{}]&endkey=["fun","couchdb"]&descending=true
只使用couchdb标签(升序)获得有趣类别中的排名:
?startkey = [“fun”,“couchdb”,0]& endkey = [“fun”,“couchdb”,0,{}]
只有“couchdb”标签(降序)的“有趣”类别中获得排名:
?startkey=["fun",0]&descending=true
我希望这有帮助。复杂键开始真正显示Map / Reduce在切片和切割数据方面的强大。
干杯。