{ "title": "My Document","date": 1279816057,"ranking": 5,"category": "fun","tags": [ "couchdb","technology" ],}
从文档中,我了解到,我可以轻松地创建一个视图,排序按字段排序。
function(doc) { emit(doc.ranking,doc); }
我也学到了,我可以很容易地过滤类型的字段
function(doc) { emit(doc.category,doc); } http://127.0.0.1:5984/database/_design/filter/_view/filter?key=%22fun%22
我的问题是,我需要做一堆这些事情在同一时间。我想根据类别和标签过滤。我应该能够过滤下来只有类别的“有趣”和标签“couchdb”的文档。我想通过按降序排序,然后按日期按升序排序,然后按标题按字母顺序排序。
如何创建一个视图,所有的排序和过滤组合?
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在切片和切割数据方面的强大。
干杯。