CouchDB视图 - 多个过滤器

时间:2012-10-17 12:28:22

标签: map mapreduce couchdb

我对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],一切都很好。

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

例如 - 所有酒店:

  • 有三颗星和旗帜“家庭友好”和“宠物友好”和 用hotelType“预算”?
  • 有hotelType“premium”和食物“早餐”或“午餐”?

有什么想法吗?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用一组值发出密钥:

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

问题是,这只有在您按重要性排序属性时才有效,因为它们总是以相同的顺序减少。 Kxepal使用不同视图的解决方案可能是您的最佳选择。

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

答案 2 :(得分:0)

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

  • x =明星
  • y = flags
  • z = hotelType

不幸的是,不支持多维查询。例如,如果您需要按纬度和经度查询地理位置,那么您必须使用GeoCouch。