代码之家  ›  专栏  ›  技术社区  ›  Apreche

同一视图中的CouchDB排序和筛选

  •  32
  • Apreche  · 技术社区  · 15 年前

    我正在尝试为一个新的应用程序使用CouchDB,我需要创建一个按多个字段排序并按多个字段过滤的视图。这是一个示例文档,我省略了id和rev以节省一些输入。

    {
        "title": "My Document",
        "date": 1279816057,
        "ranking": 5,
        "category": "fun",
        "tags": [
            "couchdb",
            "technology"
        ],
    }
    

    从文档中,我了解到我可以很容易地创建一个按字段排序的视图,比如排名。

    function(doc) {
        emit(doc.ranking, doc);
    }
    

    我还了解到,我可以很容易地通过诸如category之类的字段进行过滤

    function(doc) {
        emit(doc.category, doc);
    }
    
    http://127.0.0.1:5984/database/_design/filter/_view/filter?key=%22fun%22
    

    如何创建一个视图,将所有排序和筛选结合起来?

    1 回复  |  直到 15 年前
        1
  •  51
  •   Erik Kaplun    9 年前

    对于在一个键中发出多条数据,您需要仔细阅读 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", {}] 发射() 'd每个标签一次文档)。

    要进行按等级、日期和标题排序的额外步骤,您将向数组中再添加两个元素:整数和排名、日期或标题。记住,你可以 发射()

    function(doc) {
      for(var i = 0; i < doc.tags.length; i++)
      {
         emit([doc.category, doc.tags[i], 0, doc.ranking], doc);
         emit([doc.category, doc.tags[i], 1, doc.title], doc);
         emit([doc.category, doc.tags[i], 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", "couchdb", {}, {}]&endkey=["fun", "couchdb"]&descending=true
    

    仅在具有couchdb标签的有趣类别中获得排名(升序):

    ?startkey=["fun", "couchdb", 0]&endkey=["fun", "couchdb", 0, {}]

    ?startkey=["fun", "couchdb", 0, {}]&endkey=["fun", "couchdb", 0]&descending=true
    

    我希望这有帮助。复杂的键开始真正显示Map/Reduce在切片和切割数据方面的强大功能。

    干杯。