【问题标题】:CouchDB View - Multiple FilterCouchDB 视图 - 多重过滤器
【发布时间】:2012-10-17 12:28:21
【问题描述】:

我有一个关于 couchdb views / map-reduce 的问题。

假设我们有一个包含酒店文档的数据库,如下所示:

[{
        _id: "1",
        name: "Hotel A",
        type: "hotel",
        stars: 3,
        flags: ["family-friendly","green-hotel","sport"],
        hotelType: "premium",
        food: ["breakfast","lunch"]
    }, {
        _id: "2",
        name: "Hotel B",
        type: "hotel",
        stars: 5,
        flags: ["family-friendly","pet-friendly"],
        hotelType: "budget",
        food: ["breakfast","lunch","dinner"]
    }]

要查找所有 3 星级酒店,以下视图适合:

function(doc) {
    emit([doc.stars, doc.name]);
}

如果我使用 startkey=[3],一切都很好。

但是如何使用多个过滤器制作视图呢?

例如 - 所有酒店:

  • 带有 3 颗星和“家庭友好型”和“宠物友好型”标志和 使用hotelType“预算”?
  • hotelType 为“premium”,食物为“breakfast”或“lunch”?

有什么想法吗?

编辑: 我现在决定使用好的旧mysql。 CouchDB 对我来说是一次不错的体验,但是如果您需要的不仅仅是一个文档的数据,那么问题就太多了 :(

【问题讨论】:

    标签: map mapreduce couchdb


    【解决方案1】:

    您可以发出带有一组值的键:

    emit([[doc.stars,doc.hotelType], doc.name]);
    

    问题在于,这仅在您可以按重要性对属性进行排序时才有效,因为它们总是会以相同的顺序减少。 Kxepal 使用不同视图的解决方案可能最适合您的情况。

    来源:http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping

    【讨论】:

    • 感谢您的反馈。我知道我可以发出不止一次,并且我可以使用数组作为键。 function(doc) { // 按名称 emit([1, doc.name]); // 通过hotelType emit([2, doc.hotelType]); // 通过标志 for(var i in doc.flags) { emit([3, doc.flags[i]]); } // 由星星和一个标志 for(var i in doc.flags) { emit([4, doc.doc.flags[i]]);但是我如何搜索例如“按星星和更多的标志”?有什么解决办法吗?
    【解决方案2】:

    您需要为此使用不同的视图。每个视图都将使用自己的密钥处理自己的域。您可以通过多个具有不同 key 值的发射来创建单一视图的所有数据,但从长远来看,这将很难维护。

    【讨论】:

      【解决方案3】:

      CouchDB 视图是一维的。而你正在寻找多维查询:

      • x = 星星
      • y = 标志
      • z = 酒店类型

      很遗憾,不支持多维查询。例如,如果您需要按经纬度查询地理位置,则必须使用 GeoCouch。

      【讨论】:

      • 感谢您的反馈。但是我的问题有什么解决方案吗?不要使用沙发数据库?使用列表功能?等等……
      • 您需要为此任务考虑 SQL 数据库。
      • 要么您需要 SQL 以便您可以相互独立地比较两个值,要么您需要为您想要进行的每个搜索查询组合创建一个视图。 CouchDB 就是这样设计的,因此它可以扩展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多