CouchDB在同一视图中排序和过滤

前端之家收集整理的这篇文章主要介绍了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在切片和切割数据方面的强大。

干杯。

原文链接:https://www.f2er.com/nosql/203421.html

猜你在找的NoSQL相关文章