CouchDB在同一视图中排序和过滤
我试图使用CouchDB一个新的应用程序,我需要创建一个视图,按多个字段排序,也筛选多个字段。这里是一个示例文档,我省略了_id和_rev来保存自己一些打字。
{ "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”的文档。我想通过按降序排序,然后按日期按升序排序,然后按标题按字母顺序排序。 如何创建一个视图,所有的排序和过滤组合?
为了在一个键中发出多个数据,你需要在
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在切片和切割数据方面的强大。 干杯。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |